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,这点需要注意一下。
摘自 Lose.zhang
补充:Web开发 , ASP.Net ,