MVC中实现多按钮提交(转)
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能。
如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点。
方法一:使用客户端脚本
比如我们在View中这样写:
- <input type="submit" value="审核通过" onclick='this.form.action="<%=Url.Action("Action1") %>";' />
- <input type="submit" value="审核不通过" onclick='this.form.action="<%=Url.Action("Action2") %>";' />
- <input type="submit" value="返回" onclick='this.form.action="<%=Url.Action("Action3") %>";' />
<input type="submit" value="审核通过" onclick='this.form.action="<%=Url.Action("Action1") %>";' />
<input type="submit" value="审核不通过" onclick='this.form.action="<%=Url.Action("Action2") %>";' />
<input type="submit" value="返回" onclick='this.form.action="<%=Url.Action("Action3") %>";' />
在点击提交按钮时,先改变Form的action属性,使表单提交到按钮相应的action处理。
但有的时候,可能Action1和2的逻辑非常类似,也许只是将某个字段的值置为1或者0,那么分开到二个action中又显得有点多余了。
方法二:在Action中判断通过哪个按钮提交
在View中,我们不用任何客户端脚本处理,给每个提交按钮加好name属性:
- <input type="submit" value="审核通过" name="action" />
- <input type="submit" value="审核不通过" name="action"/>
- <input type="submit" value="返回" name="action"/>
<input type="submit" value="审核通过" name="action" />
<input type="submit" value="审核不通过" name="action"/>
<input type="submit" value="返回" name="action"/>
然后在控制器中判断:
- [HttpPost]
- public ActionResult Index(string action /* 其它参数*/)
- {
- if (action=="审核通过")
- {
- //
- }
- else if (action=="审核不通过")
- {
- //
- }
- else
- {
- //
- }
- }
[HttpPost]
public ActionResult Index(string action /* 其它参数*/)
{
if (action=="审核通过")
{
//
}
else if (action=="审核不通过")
{
//
}
else
{
//
}
}
几年前写asp代码的时候经常用这样的方法…
View变得简单的,Controller复杂了。
太依赖说View,会存在一些问题。假若哪天客户说按钮上的文字改为“通过审核”,或者是做个多语言版的,那就麻烦了。
参考:http://www.ervinter.com/2009/09/25/asp-net-mvc-how-to-have-multiple-submit-button-in-form/
方法三:使用ActionSelector
关于ActionSelector的基本原理可以先看下这个POST使用ActionSelector控制Action的选择。
使用此方法,我们可以将控制器写成这样:
- [HttpPost]
- [MultiButton("action1")]
- public ActionResult Action1()
- {
- //
- return View();
- }
- [HttpPost]
- [MultiButton("action2")]
- public ActionResult Action2()
- {
- //
- return View();
- }
[HttpPost]
[MultiButton("action1")]
public ActionResult Action1()
{
//
return View();
}
[HttpPost]
[MultiButton("action2")]
public ActionResult Action2()
{
//
return View();
}
在 View中:
- <input type="submit" value="审核通过" name="action1" />
- <input type="submit" value="审核不通过" name="action2"/>
- <input type="submit" value="返回" name="action3"/>
<input type="submit" value="审核通过" name="action1" />
<input type="submit" value="审核不通过" name="action2"/>
<input type="submit" value="返回" name="action3"/>
此时,Controller已经无须依赖于按钮的Value值。
MultiButtonAttribute的定义如下:
- public class MultiButtonAttribute : ActionNameSelectorAttribute
- {
- public string Name { get; set; }
- public MultiButtonAttribute(string name)
- {
- this.Name = name;
- }
- public override bool IsValidName(ControllerContext controllerContext,
- string actionName, System.Reflection.MethodInfo methodInfo)
- {
- if (string.IsNullOrEmpty(this.Name))
- {
- return false;
- }
- return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name);
- }
- }
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public MultiButtonAttribute(string name)
{
this.Name = name;
}
public override bool IsValidName(ControllerContext controllerContext,
string actionName, System.Reflection.MethodInfo methodInfo)
{
if (string.IsNullOrEmpty(this.Name))
{
return false;
}
return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name);
}
}
方法四、改进
Thomas Eyde就方法三的方案给出了个改进版:
Controller:
- [HttpPost]
- [MultiButton(Name = "delete", Argument = "id")]
- public ActionResult Delete(string id)
- {
- var response = System.Web.HttpContext.Current.Response;
- response.Write("Delete action was invoked with " + id);
- return View();
- }
[HttpPost]
[MultiButton(Name = "delete", Argument = "id")]
public ActionResult Delete(string id)
{
var response = System.Web.HttpContext.Current.Response;
response.Write("Delete action was invoked with " + id);
return View();
}
- <input type="submit" value="not important" name="delete" />
- <input type="submit" value="not important" name="delete:id" />
<input type="submit" value="not important" name="delete" />
<input type="submit" value="not important" name="delete:id" />
MultiButtonAttribute定义:
- [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
- public class MultiButtonAttribute : ActionNameSelectorAttribute
- {
- public string Name { get; set; }
- public string Argument { get; set; }
- public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
- {
- var key = ButtonKeyFrom(controllerContext);
- var keyIsValid = IsValid(key);
- if (keyIsValid)
- {
- UpdateValueProviderIn(controllerContext, ValueFrom(key));
- }
- return keyIsValid;
- }
- private string ButtonKeyFrom(ControllerContext controllerContext)
- {
- var keys = controllerContext.HttpContext.Request.Params.AllKeys;
- return keys.FirstOrDefault(KeyStartsWithButtonName);
- }
- private static bool IsValid(string key)
- {
- return key != null;
- }
- private static string ValueFrom(string key)
- {
- var parts = key.Split(":".ToCharArray());
- return parts.Length < 2 ? null : parts[1];
- }
- private void UpdateValueProviderIn(ControllerContext controllerContext, string value)
- {
- if (string.IsNullOrEmpty(Argument)) return;
- controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult(value, value, null);
- }
- private bool KeyStartsWithButtonName(string key)
- {
- return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase);
- }
- }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
var key = ButtonKeyFrom(controllerContext);
var keyIsValid = IsValid(key);
if (keyIsValid)
{
UpdateValueProviderIn(controllerContext, ValueFrom(key));
}
return keyIsValid;
}
private string ButtonKeyFrom(ControllerContext controllerContext)
{
var keys = controllerContext.HttpContext.Request.Params.AllKeys;
return keys.FirstOrDefault(KeyStartsWithButtonName);
}
private static bool IsValid(string key)
{
return key != null;
}
private static string ValueFrom(string key)
{
var parts = key.Split(":".ToCharArray());
return parts.Length < 2 ? null : parts[1];
}
private void UpdateValueProviderIn(ControllerContext controllerContext, string value)
{
if (string.IsNullOrEmpty(Argument)) return;
controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult(value, value, null);
}
private bool KeyStartsWithButtonName(string key)
{
return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase);
}
}
如果是在MVC 2.0中的话,将UpdateValueProviderIn方法改为:
- private void UpdateValueProviderIn(ControllerContext controllerContext, string value)
- {
- if (string.IsNullOrEmpty(Argument))
- return;
- controllerContext.RouteData.Values[this.Argument] = value;
- }
private void UpdateValueProviderIn(ControllerContext controllerContext, string value)
{
if (string.IsNullOrEmpty(Argument))
return;
controllerContext.RouteData.Values[this.Argument] = value;
}
转自:http://www.cnblogs.com/wuchang/archive/2010/01/29/1658916.html
MVC中实现多按钮提交(转)的更多相关文章
- 转:MVC单表多按钮提交
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- ASP.NET MVC实现多个按钮提交事件
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- MVC中处理表单提交的方式(Ajax+Jquery)
MVC中处理表单有很多种方法,这里说到第一种方式:Ajax+Jquery 先看下表单: <form class="row form-body form-horizontal m-t&q ...
- mvc中form表单提交的几种形式
第一种方式:submit 按钮 提交 <form action="MyDemand" method="post"> <span>关键字: ...
- MVC中获取所有按钮,并绑定事件!
<script> var btns = $('[id=addbtn]'); //不能直接使用#ID来获取,必须用[] //循环遍历所有的按钮,一个一个添加事件绑定 for (var i ...
- ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)
有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...
- asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法
MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交
- ASP.NET MVC中在Action获取提交的表单数据方法
有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...
- 在ASP.NET MVC中使用UEditor无法提交的解决办法
很简单的一个ajax提交,却怎么都不成功 $.ajax({ type: "POST", url: "/mms/riskmanage/commitreply", ...
随机推荐
- 2014年CCNU-ACM暑期集训总结
2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...
- redis预切片技术,实现
平时,我们将创建多个redis实例,以缓解单redis压力范例.但,作为高速缓存的数量增加.对redis对于扩展是一种非 - 不要无所谓.对redis有几种方法用于扩张可能.让我们添加每个redis最 ...
- ios 多线程开发(三)Run Loops
Run loops是线程相关的一些基本东西.一个run loop是一个处理消息的循环.用来处理计划任务或者收到的事件.run loop的作用是在有事做的时候保持线程繁忙,没事的时候让线程挂起. Run ...
- linux于test
订购具体解释
測试标志 代表意义 文件名称.文件类型 -e 该文件名称是否存在 -f 该文件名称是否存在且为file -d 该文件名称是否存在且为文件夹 -b 该文件名称是否存在且为一个block -c 该文件名称 ...
- POJ 3356 AGTC(最长公共子)
AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform ...
- Android组件系列----ContentProvider内容提供商【5】
2.执行query()方法,查询全部记录(眼下一共两条记录).后台输出效果例如以下: 经測试,其它方法也都是能够运行的. 事实证明,新建的另外一个project文件ContentResolverTes ...
- Java学习路径:不走弯路,这是一条捷径
1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...
- WPF学习(4)逻辑树和可视树
前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...
- gradle--java入门(转)
7.3.3 项目之间的依赖性 您可以添加项目之间的依赖性在相同的构建,所以,例如,这个一个项目的JAR文件是用来编译另一个项目,在api构建文件我们将添加一个依赖JAR产生的共享项目.由于这种依赖性, ...
- spring mvc中实现csrf安全防御简记
1.csrf是什么 csrf全称是Cross-site request forgery,http://en.wikipedia.org/wiki/Csrf 危害:使受害用户在不经意间执行了不是用户意愿 ...