ASP.NET MVC 中 如何将同一个form post到不同的action
问题描述
页面通常会有一个Search和一个Export,而这两个Action所需要的Form通常是一样的,因此就需要将同一个form动态的post到不同的action中。
方案一:实现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>
Action中:
[MultipleButton(Name = "action", Argument = "ExportToCsv")] public ActionResult ExportToCsv(){ // } [MultipleButton(Name = "action", Argument = "SearchDeliveries")] public ActionResult SearchDeliveries(FormCollection fc){ // }
方案二是在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(); });
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。