ASP.NET MVC实现多个按钮提交事件

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

如果是用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-10-04 00:47:15

ASP.NET MVC实现多个按钮提交事件的相关文章

转:MVC单表多按钮提交

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: [c-sharp] view plain copy print? <input type="submit" value="审核通过"  onclick='this.form.action="

MVC中实现多按钮提交(转)

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: [c-sharp] view plaincopyprint? <input type="submit" value="审核通过"  onclick='this.form.action="&l

ASP.NET MVC 第三章 异步提交数据

好长时间都没写文章了本来不准备在写文章了,但是我又为什么今天发表文章咧,第一是为了我自己对技术的认识.第二是为了新手不知道怎么去学习MVC写次系列文章. 废话结束吧,接下来我们看看怎么异步实现提交数据到按钮.本章就是为了WebForm用惯了事件驱动.(此处注明下有很多自认为高手的连事件都不懂是什么,不说懂就算了,直接上MVC吧) 我们根据第二章的修改路由代码接着写,此处因为本人PC不在安装VS2010所以就直接用VS2013了,不在说明怎么创建MVC的示例了.这里我使用MVC4,后面会跟大家一起

asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交 (2)特殊方式提交 2.控制器处理表单数据的四种方法 方法1:使用传统的Request请求数据 方法2:Action参数名与表单元素name值一一对应 方法3:从MVC封装的FormCollection容器中读取 方法4:使用实体作为Action参数传入,前提是提交的表单元素名称与实体属性名称一一对应 控制器源码 using MvcStudy.Models;u

ASP.NET MVC+JQuery母版页的Ajax提交问题

<pre name="code" class="javascript">Ajax内容: $(document).ready(function () { $(function () { $("#submit").click(function () { var name = $("#log").val(); var pwd = $("#pwd").val(); if (name.length ==

ASP.NET MVC Global.asax文件中的事件

1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start(object sender, EventArgs e) 4 { 5 //不是每次请求都调用 6 //在Web应用程序的生命周期里就执行一次 7 //在应用程序第一次启动和应用程序域创建事被调用 8 //适合处理应用程序范围的初始化代码 9 } 10 11 void Application_End(obj

ASP.NET MVC 3 常用

http://blog.csdn.net/churujianghu/article/details/7297358 1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的    <add key="ClientValidationEnabled" value="true"/>设置为false就行了,    这个是去掉所有model的默认验证,然后你可以在model中加上自己的验证,这样哪些属性需要验证,哪些

ASP.NET MVC 3 入门级常用设置、技巧和报错

1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的    <add key="ClientValidationEnabled" value="true"/>设置为false就行了,    这个是去掉所有model的默认验证,然后你可以在model中加上自己的验证,这样哪些属性需要验证,哪些不需要 就看你自己了 示例代码: publicclass Movie{publicint ID { get; set

asp.net MVC中使用Html.Checkbox提示该字符串未被识别为有效的布尔值错误的解决方法

在asp.net MVC中使用Html.CheckBox提交后出现该字符串未被识别为有效的布尔值错误,或从类型“System.String”到类型“System.Boolean”的参数转换失败. 错误例子:@Html.CheckBox("UserID",item.IsTrue,new{value=item.UserID}) 这是由于MVC会在页面上生成<input id="UserID" name="UserID" value="