`

ASP.NET 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") %>";' />
 

在点击提交按钮时,先改变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);
	    }
	}
 

参考:http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

方法四、改进

 

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;
}
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    asp.net mvc安装msi文件

    总的来说,通过MSI文件安装ASP.NET MVC是一种便捷的方法,尤其适合那些不熟悉命令行安装或者需要在多台计算机上部署的用户。不过,了解安装过程中的每个步骤和可能的配置选项,有助于确保顺利、高效地使用这一强大的...

    Jquery Mobile +Asp.net

    3. **AJAX请求**:jQuery的$.ajax方法可以与ASP.NET MVC的Action方法配合,实现异步数据交互。 4. **自定义主题**:jQuery Mobile允许自定义主题,这与ASP.NET MVC的视图模板相结合,可以打造出独特的应用风格。 5. ...

    asp.net mvc3分页控件源码

    在ASP.NET MVC3中,实现分页通常涉及到以下几个步骤: - **路由配置**:确保URL结构支持分页参数,如`/Controller/Action/PageNumber`。 - **控制器**:在控制器中,根据请求的页码获取对应页的数据,这通常通过...

    ASP.NET MVC实现多个按钮提交的方法

    因此,了解如何在*** MVC中实现多个按钮提交就显得十分必要。以下是几种实现多个按钮提交的方法。 方法一:使用客户端脚本 此方法通过在HTML表单中的每个按钮元素上添加onclick事件处理器来改变表单的action属性。...

    ASP.NET开发的Bug跟踪管理系统

    综上所述,这个"ASP.NET开发的Bug跟踪管理系统"涵盖了从用户交互到后端数据处理的多个层面,是学习ASP.NET Web应用开发的一个实用案例。通过深入研究这个系统,开发者可以了解到如何利用ASP.NET构建一个功能完善的...

    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(3) 源代码

    在本项目中,我们将深入探讨如何使用Ext JS MVC框架与Asp.Net MVC 3结合,构建一个简单的CMS(内容管理系统)后台,特别是关注用户管理功能。这个教程将分为多个步骤,帮助开发者逐步理解这两个强大的技术如何协同...

    基于asp.net+Web+mvc4.0 EasyUI 最新 权限管理 开源 MES建材管理系统源码

    《基于ASP.NET+Web+MVC4.0 EasyUI的建材管理系统源码解析》 在IT行业中,构建高效、安全的管理系统是企业信息化建设的重要环节。本文将详细探讨一款基于ASP.NET、Web以及MVC4.0框架,结合EasyUI进行界面设计的开源...

    ASP.NET课本中实验代码

    这些实验代码可能会涵盖以上一个或多个方面,通过实践这些代码,你可以更好地掌握ASP.NET的精髓,提升自己的编程技能。同时,"尚俊杰"可能是一位知名的ASP.NET讲师或教材作者,他的材料通常质量较高,值得深入研究。...

    ASP.net资源实现网站多语言

    5. 多语言视图:在ASP.NET MVC框架中,可以使用视图本地化,即为每个语言创建一个视图,或者使用共享视图和局部视图来实现多语言。视图中的文本可以通过 Razor 语法`@Resources.WelcomeMessage`来引用资源文件。 6....

    asp.net多语言国际化与winform多语言国际化心得

    与ASP.NET一样,每种语言对应一个资源文件,通常存储在Properties目录下的Resources.Designer.cs文件中。使用`ResourceManager`类,可以在运行时根据用户的系统设置或手动选择加载正确的资源。 为了实现WinForm的多...

    asp.net+ajax 制作一个简单的社区聊天室

    开发者会创建一个或多个ASP.NET Web Form页面,作为聊天室的前端界面。 聊天室的核心功能包括用户登录、发送消息和显示历史消息。在ASP.NET中,这些可以通过HTTP POST请求来实现。用户输入的消息会被封装到HTTP请求...

    一步一步学asp.net_mvc

    - **理解ASP.NET MVC Routing**:路由是ASP.NET MVC中的一个重要概念,用于确定如何根据URL来选择合适的控制器和动作方法。 - **在DinnersController控制器中使用DinnerRepository**:通过注入DinnerRepository实例...

    asp.net实例源码

    此外,ASP.NET还包括ASP.NET MVC(Model-View-Controller)和ASP.NET Web API,它们是两种不同的架构模式。MVC模式将应用程序分为模型、视图和控制器三个部分,鼓励松耦合和测试驱动开发。而Web API则专注于构建...

    asp.net80套经典网页设计模版

    6. **MVC模式**:ASP.NET MVC 模式是一种轻量级、基于模式的Web应用程序架构,提供更好的代码组织和测试能力。 通过这些模板,开发者可以了解到如何将ASP.NET的特性与实际的网页设计相结合,实现美观且功能丰富的...

    asp.net实现的网站首页

    在这个项目中,我们用ASP.NET来设计和实现网站的首页,这通常包括网站的导航、主要内容区域和一些动态更新的内容。 首先,数据库的选择至关重要。在这个案例中,我们使用了两种不同的数据库系统:SQL Server 2005和...

    ASP.NET完全自学手册

    8. **MVC模式**:ASP.NET MVC(Model-View-Controller)是一种设计模式,鼓励分离关注点,使代码更易于测试和维护。它提供了比传统的Web Forms更灵活的开发方式。 9. **部署和配置**:学习如何配置IIS服务器,发布...

    ASP.NET.C英文原著经典

    3. **控件和事件处理**:介绍ASP.NET中的服务器控件,如按钮、文本框等,以及它们的事件模型,如何通过代码处理用户交互。 4. **数据绑定**:讨论如何将数据库或其他数据源的数据绑定到控件,展示和编辑数据。可能...

    ASP.NET 2.0程序设计案例教程(课件)

    2. **控件和事件模型**:在ASP.NET 2.0中,服务器控件提供了一种直观的方式来创建动态网页。学习者将了解如何使用各种内置控件,如文本框、按钮、复选框等,并理解控件之间的事件交互,如点击事件、提交事件等。 3....

    asp.net编程软件

    在ASP.NET编程中,你将学习到以下几个核心知识点: 1. **.NET Framework**: ASP.NET是.NET Framework的一部分,它提供了运行时环境,用于执行ASP.NET代码。.NET Framework包括基础类库、公共语言运行时(CLR)以及...

    ASP.net 文件管理

    9. **UI设计**:使用ASP.NET MVC或Web Forms,配合Bootstrap或其他前端框架,可以创建一个美观易用的界面,展示文件列表,提供操作按钮。 10. **数据库集成**:为了记录文件元信息,如上传时间、大小、用户等,可以...

Global site tag (gtag.js) - Google Analytics