mvc多个按钮的提交方法

转载地址:http://www.cnblogs.com/wuchang/archive/2010/01/29/1658916.html

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

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

方法一:使用客户端脚本

比如我们在View中这样写:


1

2

3

<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属性:


1

2

3

<input type="submit" value="审核通过" name="action" />

<input type="submit" value="审核不通过"  name="action"/>

<input type="submit" value="返回"  name="action"/>

然后在控制器中判断:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[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的选择

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

[HttpPost]

[MultiButton("action1")]

public ActionResult Action1()

{

    //

    return View();

}

[HttpPost]

[MultiButton("action2")]

public ActionResult Action2()

{

    //

    return View();

}

在 View中:


1

2

3

<input type="submit" value="审核通过" name="action1" />

<input type="submit" value="审核不通过"  name="action2"/>

<input type="submit" value="返回"  name="action3"/>

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

MultiButtonAttribute的定义如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class MultiButtonAttribute : ActionNameSelectorAttribute

{

    public string Name { getset; }

    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:


1

2

3

4

5

6

7

8

[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:


1

2

<input type="submit" value="not important" name="delete" />

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

MultiButtonAttribute定义:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]

public class MultiButtonAttribute : ActionNameSelectorAttribute

{

    public string Name { getset; }

    public string Argument { getset; }

    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方法改为:


1

2

3

4

5

6

private void UpdateValueProviderIn(ControllerContext controllerContext, string value)

{

    if (string.IsNullOrEmpty(Argument))

        return;

    controllerContext.RouteData.Values[this.Argument] = value;

}

时间: 2024-11-05 12:14:31

mvc多个按钮的提交方法的相关文章

jQuery的ajax的form提交方法应用

1.如果不用ajax的form提交,就必须把表单的每一条数据进行获取,并提交给action进行处理.这样做比较麻烦,现在用了jQuery的easyui,使用封装好的ajax的form提交.脚本代码如下: //提交表单 function sysusersave(){ if($.formValidator.pageIsValid()){//校验表单输入信息是否合法 //使用jquery的ajax from提交,指定from的id和回调方法,提交的url使用提from中的action,参数为空,传递J

ASP.NET MVC 5 - 查询Details和Delete方法

原文:ASP.NET MVC 5 - 查询Details和Delete方法 在这部分教程中,接下来我们将讨论自动生成的Details和Delete方法. 查询Details和Delete方法 打开Movie控制器并查看Details方法. public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Movie movie

[转]ASP.NET MVC 5 - 查询Details和Delete方法

在这部分教程中,接下来我们将讨论自动生成的Details和Delete方法. 查询Details和Delete方法 打开Movie控制器并查看Details方法. public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Movie movie = db.Movies.Find(id); if (movie == nu

jsp中普通按钮如何提交表单

jsp中普通按钮如何提交表单方法1: <form action = "提交的地址">         <input type="submit" value="提交">        </form>方法2:<form action = "提交的地址">        <input type="button" value="提交" onc

Spring MVC与表单日期提交的问题

Spring MVC与表单日期提交的问题 spring mvc 本身并不提供日期类型的解析器,需要手工绑定, 否则会出现非法参数异常. org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.Date]: Constructor threw exception; nested exception is java.lang.IllegalArgumentExc

Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101

MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method属性值是get,如果看到表单没有写method属性那就是表示method是get方式提交.另外一种就是post方式. 当使用HTTP Get请求时,浏览器会提取表单中元素的name特性值及相应的value特性值放到查询字符串中.如:http://localhost?search?id=1 如果不想把

jQuery实现form表单基于ajax无刷新提交方法详解

本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult 导出EXCEL方法总结:MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可:优点:可设置丰富的EXCEL格式,缺点:需要依赖EXCEL组件,且EXCEL进程在服务器中无法及时关闭,以及服务器上会存留大量的不必要的XLS文件: 2.设置输出头为:application/ms-excel,再输出拼接的HTM

mvc存储Cookie和读取Cookie方法

mvc存储Cookie和读取Cookie方法: //存储 HttpCookie cookie = new HttpCookie("User"); System.Text.Encoding enc = System.Text.Encoding.GetEncoding("gb2312"); cookie["id"] = HttpUtility.UrlEncode(logid.ToString(), enc); cookie["UserNam