【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