网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

ASP.NETMVC中实现多个按钮提交的几种方法

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能。

image

如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点。

方法一:使用客户端脚本
比如我们在View中这样写:

  1. <inputtypeinputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Action1")%>/> 
  2. <inputtypeinputtype="submit"value="审核不通过"onclick='this.form.action="<%=Url.Action("Action2")%>  /> 
  3. <inputtypeinputtype="submit"value="返回"onclick='this.form.action="<%=Url.Action("Action3")%>" /> 

在点击提交按钮时,先改变Form的action属性,使表单提交到按钮相应的action处理。

但有的时候,可能Action1和2的逻辑非常类似,也许只是将某个字段的值置为1或者0,那么分开到二个action中又显得有点多余了。

方法二:在Action中判断通过哪个按钮提交
在View中,我们不用任何客户端脚本处理,给每个提交按钮加好name属性:

  1. <input type="submit" value="审核通过" name="action" /> 
  2. <input type="submit" value="审核不通过"  name="action"/> 
  3. <input type="submit" value="返回"  name="action"/> 

然后在控制器中判断:

  1. [HttpPost] 
  2.     public ActionResult Index(string action /* 其它参数*/
  3.     { 
  4.         if (action=="审核通过"
  5.         { 
  6.             // 
  7.         } 
  8.         else if (action=="审核不通过"
  9.         { 
  10. // 
  11.         } 
  12.         else 
  13.         { 
  14.             // 
  15.         } 
  16.     } 

几年前写asp代码的时候经常用这样的方法…

View变得简单的,Controller复杂了。

太依赖说View,会存在一些问题。假若哪天客户说按钮上的文字改为“通过审核”,或者是做个多语言版的,那就麻烦了。

方法三:使用ActionSelector
关于ActionSelector的基本原理可以先看下这个POST使用ActionSelector控制Action的选择。

使用此方法,我们可以将控制器写成这样:

  1. [HttpPost] 
  2. [MultiButton("action1")] 
  3. public ActionResult Action1() 
  4.     // 
  5.     return View(); 
  6. [HttpPost] 
  7. [MultiButton("action2")] 
  8. public ActionResult Action2() 
  9.     // 
  10.     return View(); 

在 View中:

  1. <input type="submit" value="审核通过" name="action1" /> 
  2. <input type="submit" value="审核不通过"  name="action2"/> 
  3. <input type="submit" value="返回"  name="action3"/> 

此时,Controller已经无须依赖于按钮的Value值。

MultiButtonAttribute的定义如下

  1. public class MultiButtonAttribute : ActionNameSelectorAttribute 
  2.     public string Name { getset; } 
  3.     public MultiButtonAttribute(string name) 
  4.     { 
  5.         this.Name = name; 
  6.     } 
  7.     public override bool IsValidName(ControllerContext controllerContext, 
  8.         string actionName, System.Reflection.MethodInfo methodInfo) 
  9.     { 
  10.         if (string.IsNullOrEmpty(this.Name)) 
  11.         { 
  12.             return false
  13.         } 
  14.         return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name); 
  15.     } 

方法四、改进
Thomas Eyde就方法三的方案给出了个改进版:

Controller:

  1. [HttpPost]  
  2. [MultiButton(Name = "delete", Argument = "id")]  
  3. public ActionResult Delete(string id)  
  4. {  
  5.     var response = System.Web.HttpContext.Current.Response;  
  6.     response.Write("Delete action was invoked with " + id);  
  7.     return View();  
  8. }  

View:

  1. <input type="submit" value="not important"  name="delete" /> 
  2. <input type="submit" value="not important" name="delete:id" /> 

MultiButtonAttribute定义:

  1. [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]  
  2.     public class MultiButtonAttribute : ActionNameSelectorAttribute  
  3.     {  
  4.         public string Name { getset; }  
  5.         public string Argument { getset; }  
  6.  
  7.         public override bool IsValidName(ControllerContext controllerContext, string  
  8.                                          actionName, MethodInfo methodInfo)  
  9.         {  
  10.             var key = ButtonKeyFrom(controllerContext);  
  11.             var keyIsValid = IsValid(key);  
  12.  
  13.             if (keyIsValid)  
  14.             {  
  15.                 UpdateValueProviderIn(controllerContext, ValueFrom(key));  
  16.             }  
  17.  
  18.             return keyIsValid;  
  19.         }  
  20.  
  21.         private string ButtonKeyFrom(ControllerContext controllerContext)  
  22.         {  
  23.             var keys = controllerContext.HttpContext.Request.Params.AllKeys;  
  24.             return keys.FirstOrDefault(KeyStartsWithButtonName);  
  25.         }  
  26.  
  27.         private static bool IsValid(string key)  
  28.         {  
  29.             return key != null;  
  30.         }  
  31.  
  32.         private static string ValueFrom(string key)  
  33.         {  
  34.             var parts = key.Split(":".ToCharArray());  
  35.             return parts.Length < 2 ? null : parts;  
  36.         }  
  37.  
  38.         private void UpdateValueProviderIn(ControllerContext controllerContext,  
  39.                                             string value)  
  40.         {  
  41.             if (string.IsNullOrEmpty(Argument)) return;  
  42.             controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult 
  43.                                                      (value, value, null);  
  44.         }  
  45.  
  46.         private bool KeyStartsWithButtonName(string key)  
  47.         {  
  48.             return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase);  
  49.         }  
  50.     }  
  51.  
  52. //如果是在MVC 2.0中的话,将UpdateValueProviderIn方法改为: 
  53.  
  54. private void UpdateValueProviderIn(ControllerContext controllerContext, string value) 
  55.     if (string.IsNullOrEmpty(Argument)) 
  56.         return
  57.     controllerContext.RouteData.Values[this.Argument] = value; 
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师