【ASP.NET MVC】複数のsubmitボタンがある場合の、ビュー、コントローラーの書き方
■nameがボタンごとに異なる場合
ビューのコード
```HTML
@using(Html.BeginForm())
{
@Html.AntiForgeryToken();
// テキストボックス等の入力項目の設定
<input type="submit" name="Search" value="検索">
<input type="submit" name="Clear" value="クリア">
}
```
コントローラー
```C#
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string search, string clear)
{
if (search != null)
{
// 検索ボタンが押された場合の処理
}
if (clear != null)
{
// クリアボタンが押された場合の処理
}
}
```
ActionResult Indexの引数にはボタンのvalue属性を受け取ることができる。
searchボタンを押す → searchに"検索"、clearはnull
clearボタンを押す → clearに"クリア" 、searchはnull
※name属性とパラメータで大文字、小文字の違いがあっても正常にモデルバインディングされる。
■nameがすべてのボタンで同じ場合
ビュー
```HTML
@using(Html.BeginForm())
{
@Html.AntiForgeryToken();
// テキストボックス等の入力項目の設定
<input type="submit" name="cmd" value="検索">
<input type="submit" name="cmd" value="クリア">
}
```
コントローラー
```C#
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string cmd)
{
if (cmd == "検索")
{
// 検索ボタンが押された場合の処理
}
if (cmd == "クリア")
{
// クリアボタンが押された場合の処理
}
```
この方法の場合、value属性が同一のボタンが複数ある場合は正しく認識されないらしい。
?同じ機能で、同じ処理をさせたいボタンが複数ある場合はうまくいかないのか?
→実際に試してみる
■セレクター属性を作成する
ExtensionsフォルダにButtonAttributeクラスファイルw作成する。(実際はどのフォルダでも問題ない)
セレクタ属性のコード
```C#
using System.Reflection;
using System.Web.Mvc;
namespace Project.Extensions
{
public class ButtonAttribute : ActionMethodSelectorAttribute
{
// アクションメソッド付加時に設定したボタン名を保存
public string ButtonName { get; set; }
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
// 設定したボタン名と同名のデータが存在するかチェック(Requestで返ってきているか)
return controllerContext.Controller.ValueProvider.GetValue(ButtonName) != null;
}
}
}
```
ビュー
```HTML
@using(Html.BeginForm())
{
@Html.AntiForgeryToken();
// テキストボックス等の入力項目の設定
<input type="submit" name="Search" value="検索">
<input type="submit" name="Clear" value="クリア">
}
```
コントローラー
```C#
using Project.Extensions;
[HttpPost]
[Button(ButtonName = "Search")]
[ValidateAntiForgeryToken]
public ActionResult Index()
{
// 検索ボタンが押された場合の処理
}
```
アクションメソッドに[Button(ButtonName = "XXXXX")]を付加する。
”XXXXX"には、このアクションメソッドを実行させたいボタンのname属性値を設定する。
ボタンのname属性値と[Button(ButtonName = "XXXXX")]で大文字、小文字の違いがあっても 正常に機能する。
■その他
セレクター属性を使った方法で、HTML5のformaction、formmethodを使った方法がある?
■参考
・ほとんど
https://qiita.com/echoprogress/items/17e85ad489bddf07b540
・formaction,formmethodに関する記述
http://heinlein.hatenablog.com/entry/2018/02/21/151026