ページに1つのフォームがあり、2つの方法で送信できます。1つはアンカータグで、もう1つは送信ボタンです。どちらも動作が異なります。
それぞれに個別のアクションメソッドを割り当てるにはどうすればよいですか?ありがとう。
ページに1つのフォームがあり、2つの方法で送信できます。1つはアンカータグで、もう1つは送信ボタンです。どちらも動作が異なります。
それぞれに個別のアクションメソッドを割り当てるにはどうすればよいですか?ありがとう。
それは本当にアンカータグが何をするかに依存します-おそらくそれはjavascriptで送信をトリガーしていますか?
GET
の代わりに実際に実行している場合POST
は、@ dbasemanが提案するように実行できます。つまり、2つの要求タイプに対して別々のアクションメソッドを使用します。
しかし、アンカーがjavascript送信を行う場合、私の好みは、送信ボタンに名前を付けて、サーバー上で1つのアクションメソッドで検出できるようにし、そこからコードをフォークすることです。
<submit name="fromButtom" value="Submit" />
そして、あなたの行動方法:
public ActionResult Foo(string fromButton)
{
//if 'fromButton' contains 'Submit' then you assume it was the button.
}
さらに良いのは、<button>
代わりに使用して、表示されたテキストをボタンが送信する値から切り離すことができることです(ページをローカライズしている場合に便利です)。
<button name="submitMethod" value="fromButton">Submit</button>
submitMethod
これで、アクションメソッドにパラメータを設定できます。このパラメータでを検索し'fromButton'
ます。
いずれにせよ、ボタンの値はクリックされたときにのみ送信されるため、アンカータグ/ javascript(それがあなたのやり方である場合)はこの値を送信しません。
アクションのさまざまなバージョンでMVCHttpPost属性とHttpGet属性を使用するだけです。
[HttpPost]
public ActionResult FormAction(Model model, string method = post) { ... }
[HttpGet]
public ActionResult FormAction(Model model) { ... }
Url.ActionまたはHtml.ActionLinkhttp://geekswithblogs.net/liammclennan/archive/2008/05/21/122298.aspxを使用できます。
メソッドが完全に異なる場合は、JavaScriptを使用して動作を変える必要があります。たとえば、jQueryの場合、次のようになります。
$("#sbutton").click(function() {
alert("Submit button clicked!");
// Do whatever you need - validate/initialize-fields/etc.
return false; // This is required to prevent normal form submit
});
$("#slink").click(function() {
alert("Link clicked!");
// Do whatever you need - validate/initialize-fields/etc.
return false; // This is required to prevent normal form submit
});
別の解決策を追加するために、JavaScriptをオフにして動作するものを作成したいが、ボタンの名前と値を変更するのが不便な場合は、本番コードで使用したこれを試すことができます。
次のようなヘルパーを作成します。
using System;
using System.Reflection;
using System.Web.Mvc;
namespace Whatever
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleSubmitAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext,
string actionName, MethodInfo methodInfo)
{
bool isValidName = false;
string keyValue = string.Format("{0}:{1}", Name, Argument);
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
if (value != null)
{
value = new ValueProviderResult(Argument, Argument, null);
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
isValidName = true;
}
return isValidName;
}
}
}
そして今、あなたのフォームであなたはこの種のことをすることができます:
<input type="submit" name="action:DoSomething" value="Do something" />
<input type="submit" name="action:DoSomethingElse" value="Do something else" />
そして、コントローラーで、アクションメソッドを次のように装飾できます。
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomething")]
public ActionResult DoSomething(ViewModel vm)
{ ... }
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")]
public ActionResult DoSomethingElse(ViewModel vm)
{ ... }