- 浏览: 1006166 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (445)
- Java (22)
- J2EE (18)
- Flex (102)
- Flex-blazeds (1)
- Flex-FABridge (2)
- Flex4 (3)
- CheckStyle (2)
- PowerDesigner (0)
- POI (2)
- Java2Word (2)
- 杂项 (15)
- 日记 (3)
- 数据库-oracle (41)
- 数据库-SQLServer (7)
- 中间件 (1)
- 英语 (8)
- C# (43)
- ASP.net (72)
- ASP.net MVC (28)
- 微软-Entity Framework (19)
- JavaScript (22)
- JQuery (31)
- EasyUI (3)
- VS2010 (4)
- CVS (1)
- Tomcat (3)
- Linux (1)
- 遗留问题 (1)
- iphone (1)
- MAC (0)
- 系统 (2)
- Web Service (4)
- Cache Manager (1)
- PMP (1)
- WCF (10)
- BootstrapJs (1)
- Web API (6)
- Go语言 (0)
- 网络协议 (2)
- Redis (10)
- RabbitMQ (10)
- Git (3)
- Kafka (5)
- ELK (5)
- Nginx (3)
- 测试 (2)
最新评论
-
ygm0720:
Table行拖拽自己实现 -
程乐平:
Flex4开发视频教程(27集)下载http://bbs.it ...
Flex4教程 -
liuweihug:
Jquery+asp.net 后台数据传到前台js进行解析的办 ...
AJAX $.toJSON的用法或把数组转换成json类型 -
weilikk:
谢谢谢谢!!
javascript IE下不能用 trim函数解决方法 -
gxz1989611:
vigiles 写道请问楼主:[Fault] exceptio ...
blazeds推送技术至Flex
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能。
如果是用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") %>";' />
在点击提交按钮时,先改变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"/>
然后在控制器中判断:
[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(); }
在 View中:
<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); } }
方法四、改进
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(); }
View:
<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); } }
如果是在MVC 2.0中的话,将UpdateValueProviderIn方法改为:
private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.RouteData.Values[this.Argument] = value; }
发表评论
-
asp.net mvc处理css和js版本问题
2018-05-24 16:40 1331当服务的修改了js和css内容后,发布到II ... -
分布式系统调用链监控
2018-02-22 14:36 829分布式系统调用链监 ... -
使用C# 和Consul进行分布式系统协调
2017-05-11 10:41 1250随着大数据时代的到来,分布式是解决大数据问题的一个主要手段, ... -
权限控制
2016-06-16 11:09 761权限控制就是分为“用户登录身份验证”、“控制器方法权限控制” ... -
[ASP.NET MVC ]13 - Helper Method
2016-06-15 13:44 575我们平时编程写一些辅助类的时候习惯用“XxxHelper”来 ... -
[ASP.NET MVC]14 - Unobtrusive Ajax
2016-06-15 12:46 632Ajax (Asynchronous JavaScript ... -
[ASP.NET MVC ]08 - Area 使用
2016-06-15 12:28 731ASP.NET MVC允许使用 Area(区域)来组织Web ... -
将ASP.NET MVC中的form提交改为ajax提交
2016-06-01 15:51 2409在ASP.NET MVC视图中通过 @using (Htm ... -
@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
2016-06-01 14:02 998ASP.NET MVC 中@Html.Partial,@Ht ... -
Fiddler 模拟http form提交
2016-04-19 10:01 1611以下为代码部分 下面是fiddler调用此form ... -
MVC3 验证码
2011-11-07 14:30 1552MVC3开发,看附件 -
MVC 分页 JQuery Pager
2011-11-07 13:00 3154导入的包 <script type=" ... -
ASP.NET MVC - Creating a SelectListItem with the disabled="disabled" attribute
2011-10-24 15:07 1451要完成这样的效果 <option disabled=& ... -
希望大家告诉我一些关于.net MVC3 MVC2的书籍
2011-10-21 16:36 1450大家好,小弟进入微软时间不久,正在学习微软的MVC3,但是基本 ... -
Jquery与.net MVC结合,通过Ajax
2011-10-14 09:55 2607在工作中做了这么一个东西。 Html端: @using T ... -
Radio Button and CheckBox在FireFox中刷新自动改变选中项
2011-08-29 12:54 2754今天开发过程中出现了这样一个问题,我选中radio butto ... -
jQuery Supertextarea Plugin
2011-08-18 11:46 1244http://truthanduntruth.com/deve ... -
详解ASP.NET MVC中DropDownList的使用
2011-07-27 17:27 2209本文我们将讲解DropDownList的使用,这在ASP.NE ... -
MVC ASP页面叫Control的各种方法
2011-07-11 15:43 1607<%@ Control Language="C ... -
ASP.NET MVC 学习: 视图
2011-07-07 16:24 1807用视图呈现UI 视图可以不包含任何应用逻辑或者数据库 ...
相关推荐
基于asp.net mvc验证码的实现。
【ASP.NET编程知识】ASP.NET MVC实现多个按钮提交的方法.docx
asp.net mvc4 实现用户的登录验证
ASP.net MVC3 中文教程ASP.net MVC3 中文教程ASP.net MVC3 中文教程ASP.net MVC3 中文教程
Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程
asp.net mvc3 表单提交和异步提交;asp.net mvc3 表单提交和异步提交
通过本书的学习,读者可以全面掌握ASP.NET MVC的开发,并从代码中获取软件开发与架构设计的经验与灵感。本书具有很大的参考价值,既适合ASP.NET MVC开发初学者阅读,也适合有一定基础的ASP.NET MVC开发人员进行技术...
ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比...
asp.net MVC4 CMS 完整的源代码,学习和提高asp.net mvc4可以参考一下。
ASP.NET MVC 5 - 添加一个模型 6. ASP.NET MVC 5 - 创建连接字符串并使用SQL Server LocalDB 7. ASP.NET MVC 5 - 从控制器访问数据模型 8. ASP.NET MVC 5 - 验证编辑方法和编辑视图 9. ASP.NET MVC 5 - 给电影表和...
主要为大家详细介绍了ASP.NET MVC实现图片上传、图片预览显示的相关资料,需要的朋友可以参考下
ASP.NET MVC Linq to SQL 实现数据库增删改(源代码)ASP.NET MVC Linq to SQL 实现数据库增删改(源代码) ASP.NET MVC 分页控件
asp.net mvc中实现卷轴网格报表
AngularJS 开发 ASP.NET MVC.
asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧
Pro ASP.NET MVC 5 (精通ASP.NET MVC5框架) 中文+英文+配套源代码
The power of ASP.NET MVC 5 stems from the underlying ASP.NET platform. To make your ASP.NET MVC applications the best they can be, you need to fully understand the platform features and know how they ...
MVC专家“梦之队”对ASP.NET MVC 4的全新诠释 由Microsoft专家和极受敬重的软件开发社区负责人撰写的《ASP.NET MVC 4高级编程(第4版)》将带您学习最前沿的Web框架:ASP.NET MVC 4。本书开篇简要介绍ASP.NET MVC框架...
ASP.NET MVC 4 in Action is a hands-on guide that shows you how to apply ASP.NET MVC effectively. After a high-speed ramp up, this thoroughly revised new edition explores each key topic with a self-...
ASP.NET MVC5 高清完整版,适合新手学习,理解MVC架构