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,這點需要注意一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM