さまざまなアクション操作を実行するための4つの送信ボタンがあります。ワンサブミットのために私はこのように書いています
@using (Html.BeginForm("Edit", "Seller", FormMethod.Post)){
}
複数の送信ボタンに対してどのようにできますか?すべての送信ボタンに同じものを書く必要がありますか?
さまざまなアクション操作を実行するための4つの送信ボタンがあります。ワンサブミットのために私はこのように書いています
@using (Html.BeginForm("Edit", "Seller", FormMethod.Post)){
}
複数の送信ボタンに対してどのようにできますか?すべての送信ボタンに同じものを書く必要がありますか?
これは、2 つの送信ボタンに対して行う方法です。同様に、「n」個の送信ボタンに対してもこれを行うことができます。
以下は、送信ボタンが 2 つあるフォームです。これらの送信ボタンは両方とも同じ名前、つまり「submitButton」であることに注意してください</p>
@Html.BeginForm("MyAction", "MyController"); %>
<input type="submit" name="submitButton" value="Button1" />
<input type="submit" name="submitButton" value="Button2" />
}
コントローラーに移ると、Action は string stringButton という入力パラメーターを受け取ります。残りは一目瞭然です。
public ActionResult MyAction(string submitButton) {
switch(submitButton) {
case "Button1":
// do something here
case "Button2":
// do some other thing here
default:
// add some other behaviour here
}
...
}
このユースケースには MultiButtonAttribute を使用しています。それは素晴らしく、明確です。ロジックをさまざまなアクション メソッドに分けることができます。
マルチボタン属性
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public MultiButtonAttribute(string matchFormKey) : this(matchFormKey, null) {
}
public MultiButtonAttribute(string matchFormKey, string matchFormValue) {
this.MatchFormKey = matchFormKey;
this.MatchFormValue = matchFormValue;
}
public string MatchFormKey { get; set; }
public string MatchFormValue { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
string value = controllerContext.HttpContext.Request[MatchFormKey];
return value != null && (value == MatchFormValue || MatchFormValue == null);
}
}
コントローラ内
[HttpPost]
[MultiButton("buttonPreviousPage")]
public ActionResult NavigateToPreviousPage(int currentPageIndex)
{
// .. action logic
}
ビューで
@using (Html.BeginForm("SomeDefaultAction", "MyController", FormMethod.Post)){
<input type="submit" id="buttonPreviousPage" name="buttonPreviousPage" value="Previous" />
<input type="submit" id="buttonNextPage" name="buttonNextPage" value="Next" />
}
使い方
MultiButtonAttribute
拡張することが重要ですActionNameSelectorAttribute
。MVC がルートに一致する正しいメソッドを選択し、メソッドでそのような属性を見つけると、IsValidName
属性を渡してメソッドを呼び出しますControllerContext
。キー (ボタン名) が POST された形式であり、null 値を持たないかどうかを調べているよりも (または、最終的にキー (ボタン) の期待値を定義できますが、必須ではありません)。
MVC 2 ではかなりうまく機能します (ただし、それ以降のバージョンでも機能することを願っています)。もう 1 つの利点は、ボタンの値をローカライズできることです。