ASP.NET MVCで同じform postを異なるactionにどのようにするか

2653 ワード

問題の説明ページには通常、1つのSearchと1つのExportがありますが、この2つのActionに必要なFormは通常同じであるため、同じformの動的postを異なるactionに動的にする必要があります.シナリオ1:MVCフレームワークのAttributeを実現し、Actionの選択ロジックを完了し、Viewのbuttonのnameにactionを設定する情報にattributeを追加する
[AttributeUsage(AttributeTargets.Method)]
    public class MultipleButtonAttribute : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }


        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            var isValidName = false;
            var keyValue = string.Format("{0}:{1}", Name, Argument);
            var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);


            if (value != null)
            {
                controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
                isValidName = true;
            }


            return isValidName;
        }
    }

説明:このAttributeはActionNameSelectorAttributeから継承されているため、MVC FrameworkがActionを選択するとIsValidNameメソッドが呼び出され、ここではフロントエンドに伝わる特殊なパラメータを判断することでどのactionを呼び出すかを決定し、フロントエンドviewとactionのマッピングロジックを完了する
次に、Viewで次のように設定します.
Search:
 <div class="col-xs-8">
            <button type="submit" name="action:SearchDeliveries" class="btn btn-success">Search</button>
        </div>

Export:
 <button type="submit" name="action:ExportToCsv" class="btn btn-default">Export</button>

アクション:
[MultipleButton(Name = "action", Argument = "ExportToCsv")]
        public ActionResult ExportToCsv(){
	//
}


[MultipleButton(Name = "action", Argument = "SearchDeliveries")]
        public ActionResult SearchDeliveries(FormCollection fc){
//
}

シナリオ2はjavascriptで完了しました.
考えてみてください.post時にフォームのactionをリダイレクトすればいいです.
 $("#btnDateRangeSearch").click(function() {
                    var frm = $("#searchContainer").parent();
                    frm.attr("action", "@Url.Action("SearchDeliveries")");
                    frm.submit();
                });


                $("#btnExport").click(function () {
                    var frm = $("#searchContainer").parent();
                    frm.attr("action", "@Url.Action("ExportToCsv")");
                    frm.submit();
                });