zoukankan      html  css  js  c++  java
  • MVC中一个表单实现多个提交按钮(一个action搞定添删改)

    默认情况下,一个表单只能有一个提交事件,这不难理解,但有时我们需要有多个实现,早在ASP时代就可以实现这个功能,难道到了MVC时代后,功能削减了?当然不是,这和MVC本身有关,微软在这方面比较提倡一个提交事件对应一个action,这和它自代的实例是相吻合的,而一个action可能会根据请求方式不同分为GET和POST两种,这样的设计确实很清晰,代码可能是这样

    public ActionResult Index()
    {
        if (current.HasUserInfo)
            Response.Write(current.UserInfo.UserName);
        else
            Response.Write("没?有Dcookies");
        return View();
    }
    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
       ClientHelper.StandUserInfo(new ClientUserBase { UserName = "zzl", UserID = "1", Password = "123", Email = "bobo" });
        if (current.HasUserInfo)
            Response.Write(current.UserInfo.UserName);
        else
            Response.Write("没Dcookies");
        return View();
    }
    而如果我们非要将三个按钮集成到一个action上也不是没有可能,我们可以借助.net的特性(attribute)功能实现
     
    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);
           }
       }
    

    而我们的Index方法会加上一个特性来实现多按钮提交的功能,代码如下

        [HttpPost]
           [MultiButton("write")]
           public ActionResult Index(FormCollection form)
           {
       ClientHelper.StandUserInfo(new ClientUserBase { UserName = "zzl", UserID = "1", Password = "123", Email = "bobo" });
               if (current.HasUserInfo)
                   Response.Write(current.UserInfo.UserName);
               else
                   Response.Write("没?有Dcookies");
               return View();
           }
    
           [HttpPost]
           [MultiButton("del")]
           public ActionResult Index(FormCollection form, int? a)
           {
               ClientHelper.UserLogout();
               if (current.HasUserInfo)
                   Response.Write(current.UserInfo.UserName);
               else
                   Response.Write("没?有Dcookies");
               return View();
           }
    

    其中[MultiButton("del")] 这个特性中的del代表前台按钮的name,而不是ID,这点需要注意一下。

  • 相关阅读:
    C#编程(七十九)---------- 反射
    C#编程(七十一)---------- 自定义特性
    C#编程(七十六)----------使用指针实现基于栈的高性能数组
    C#编程(七十五)----------C#使用指针
    微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
    [asp.net]c# winform打印类
    Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
    ValueError: invalid literal for int() with base 10: 'abc'
    检查网址是否正常访问
    Python测试网络连通性示例【基于ping】
  • 原文地址:https://www.cnblogs.com/lori/p/2364360.html
Copyright © 2011-2022 走看看