ASP.NET教程:网页表单多个按钮完成不同功能

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

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

方法一:使用客户端脚本

比如我们在View中这样写:


以下为引用的内容:

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

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

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

时间: 2024-10-31 16:58:40

ASP.NET教程:网页表单多个按钮完成不同功能的相关文章

用dreamvear制作的网页表单内容链接数据库,不知道为什么提示错误,求大神指点,在线等

问题描述 用dreamvear制作的网页表单内容链接数据库,不知道为什么提示MicrosoftVBScript编译器错误错误'800a0408'无效字符/s071203237/regconfirm.asp,行17STUID=request.form("STUID")-------------------------^代码如下:<body><%dimconnsetconn=server.CreateObject("ADODB.CONNECTION")

JavaScript获取网页表单提交方式的方法_javascript技巧

本文实例讲述了JavaScript获取网页表单提交方式的方法.分享给大家供大家参考.具体如下: JavaScript获取网页表单的提交方式是get还是post,获取提交方式可以通过表单的method属性获得 <!DOCTYPE html> <html> <body> <form id="frm1" action="form_action.asp" method="get"> First name:

网页设计:WEBJX收集优秀的网页表单设计例子

文章描述:30个非常优秀的网页表单设计例子. 网页表单作为访问者与网站所有者主要的沟通途径,确保网页表单比较容易理解和使用起来比较直观成为网页设计的重要目标之一.每个网站都会有适合自己风格的表单,新颖的网页表单设计能吸引用户的注意力,让更多的用户填写反馈信息.在本文中将展示国外一些非常优秀的网页表单设计例子,以供欣赏借鉴. RxBalance Awesome Brian Handley Gowalla Form Spring Buffalo [1] [2] [3] [4] [5]  下一页

网页表单输入框设计:精心简化表单输入框

文章描述:简化输入 - 让网页表单更亲切. 大部分人不喜欢填表单,因为人们来到网站,主要目的不是填表,而是浏览或者购买.精心设计的表单,使输入变得流畅让人心情愉悦,而糟糕的设计让人扶墙吐血.那怎样才是优秀的表单呢?页面的布局.逻辑组织.视觉样式等都是值得关注的细节,其中简化输入是最近常被提及的,在这里我分享下自己工作中的心得- 1. 更高大的输入框 增加输入框高度,加粗字体,可以让网页上的输入框看起来更容易填写和阅读.随着电脑显示器尺寸变大,这样的输入框也显得更大气. 2. 添加选取器. 与其让

网页设计参考:寻找设计网页表单的灵感

网页制作Webjx文章简介:一组网页表单页面设计欣赏. 网页表单看似是网站中最常用的页面,内容大多也不会有啥变化,但这样看似简单的表单设计起来并不容易,原因就在于太简单了,所以在一些新手设计时会感觉不知从何开始.其实对于网页设计老手来说,表单设计也有自己的规律,最常用的一种方式就是根据网站整体风格进行设计. 而一些本身就很干净的网页来说,设计起来就需要花些功夫了.本文推荐的几个表单页面包含了复杂与干净的不同网站风格.可以从中寻找设计网页表单的灵感.

WEBJX收集30个优秀的网页表单制作实例

这里是30个相比风格更加明显,更注重"外貌"的包括评论表单在内的一些优秀的表单应用设计,任何人都希望可以在使用产品的同时能获得愉悦的感受,因此,一个提供易用漂亮的交互方式的Web表单可以吸引更多用户的响应,在愉悦使用的同时留下更直观的视觉印象. 相关文章: 网页设计师参考:网页登录表单设计实例 网页交互设计参考:漂亮的网页登陆表单设计实例 CSS网页设计实例:15个用CSS设计的网页表单实例 1. Synch Media 2. Ft designer 3. Glass house 4.

测试网页表单的交互设计

作为网页表单交互设计,有时候网页设计师本身要进行一些极端的测试,这就包括填写和思考一些普通用户很难想去做的一些动作.比如在价格输入框中填写英文字母,什么都不输入的时候按提交按钮等等. 一般作为测试者,我们都要尽可能的把一切可能发生的用户行为考虑到,即便这种可能性出现的概率很低. 以下我们来具体分析啊下网页表单的交互设计中的极限测试以及对淘宝等网站进行观察,看看这些大网站对于表单交互测试做到了什么程度! 如图: 1. 你会在search bar什么都不输入的情况下就按search button吗?

有效网页表单的八条规则

如果你正从你的用户那里收集信息, 没有比网页表单更简单和直接的办法了.一份有良好设计的表单可以提供有价值的信息, 相反, 他们有可能把用户吓跑.明确了这一点之后, 每个设计师就应该知道一些设计网页表单的规则. 文章中所有的实例都是用CoffeeCup Web Form Builder生成的. 1. 保守性的搭建, 并带有目的性的设计表单 我们要面对的现实是没有人喜欢花大把的时间填写表单. 保持表单的短小精悍并且剔除绝对不必要的或者不会提供实际收效的表单元素. 保证表单的每个部分都对整体起到了推动

网页表单设计中的反馈提示

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://lilong4174.blogbus.com/logs/39063960.html 反馈这个词儿其实是控制论的基本概念,泛指发出的事物返回发出的起始点并产生影响.在信息交互过程(输入输出)中,它是一种界面输出物,用以提醒信息输入者他的操作结果.它有很多种形式,包括界面元素.声音.影像变化和物理位移(如震动)等. 我们这里讨论的反馈仅特指用户对网页表单元素进行操作所得到的可视化的输出信息,为了加强区分避免歧义,我们这里姑