47978


ASP.NET Core(2.1) MVCでWebアプリを構築しています。

[複数ボタンのあるFormで押されたボタンを判断する](https://qiita.com/echoprogress/items/17e85ad489bddf07b540)

上記サイトの「セレクター属性を作成する」を参考に、Viewに複数ボタンを配置し、アクションメソッドを区別するということをやりたいと思っていますが、ASP.NET
Core(2.1) ではIsValidForRequestの引数が変わっており、同様のことが実現できません。

ご教授いただけないでしょうか。


CC BY-SA 4.0
2018-08-29T23:18:03.330
47925
2018-08-31T13:32:33.343
2018-08-31T12:44:24.337
15171
23424
question
c# html5 asp.net
ASP.NET Core MVCで、複数ボタンを区別するには？


セレクター属性のコードを、以下のように変更すれば動作します。

[code]

    using Microsoft.AspNetCore.Mvc.Abstractions;
    using Microsoft.AspNetCore.Mvc.ActionConstraints;
    using Microsoft.AspNetCore.Routing;
    
    namespace test.Extensions
    {
        public class ButtonAttribute: ActionMethodSelectorAttribute
        {
            // アクションメソッド付加時に設定したボタン名を保存
            public string ButtonName { get; set; }
    
            public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor actionDescripter)
            {
                // 設定したボタン名と同名のデータが存在するかチェック（Requestで返ってきているか）
                return routeContext.HttpContext.Request.HasFormContentType && 
                    routeContext.HttpContext.Request.Form.Keys.Contains(ButtonName);
            }        
        }
    }
    
[/code]

しかし、HTML5の`input`の`formaction`属性で送信先のURLを設定できるので、こちらを使った方が簡単です。`form`タグの`action`よりも`formaction`の方が優先します。  
ビューのコードは、

[code]

    <form method="post">
         @*テキストボックス等の入力項目の設定*@
    
        <input type="submit" formaction="/Home/Search" name="Search" value="検索">
        <input type="submit" formaction="/Home/Clear" name="Clear" value="クリア">
    </form>
    
[/code]

又は、Tag Helpersを使うと、

[code]

    <form method="post">
         @*テキストボックス等の入力項目の設定*@
    
        <input type="submit" asp-action="Search" name="Search" value="検索">
        <input type="submit" asp-action="Clear" name="Clear" value="クリア">
    </form>
    
[/code]

コントローラーのコードは、

[code]

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Search()
    {
        // 検索ボタンが押された場合の処理
    }
    
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Clear()
    {
        // クリアボタンが押された場合の処理
    }
    
[/code]


CC BY-SA 4.0
2018-08-31T12:21:55.437
47978
2018-08-31T13:32:33.343
2018-08-31T13:32:33.343
15171
15171
47925
answer