ASP.NET MVC:具有相同签名的成员已存在错误
问题描述:
我有两个具有相同名称的控制器。一个用[get],另一个用[post]。这两个执行完全不同的功能。为什么他们不能是同一个名字?ASP.NET MVC:具有相同签名的成员已存在错误
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult AddCriteriaItem(CriteriaItemAddFormCollection ciafc)
{
return View(ciafc);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddCriteriaItem(CriteriaItemAddFormCollection ciafc)
{
string GroupName = (string)Session["SelectedGroupName"];
//add group or tab
switch (ciafc.CriteriaID)
{
case (int)enums.Criterias.Tab:
Template.AddTab(ciafc.TemplateID, ciafc.name, ciafc.description);
Response.Redirect(Server.UrlDecode(ciafc.rtn));
break;
case (int)enums.Criterias.Group:
Template.AddGroup(ciafc.TemplateID, ciafc.name, ciafc.description, ciafc.TabName);
ViewData["CategoryID"] = ciafc.CategoryID;
Response.Redirect(Server.UrlDecode(ciafc.rtn));
break;
default:
if (!string.IsNullOrEmpty(GroupName.ToString()) && ciafc.CriteriaID > 0 && !string.IsNullOrEmpty(ciafc.TabName))
{
Template.AddCriteriaItem(ciafc.TabName, GroupName, ciafc.name, ciafc.description, ciafc.options, ciafc.CriteriaID, ciafc.TemplateID);
}
ViewData["rtn"] = Server.UrlDecode(ciafc.rtn);
ViewData["TemplateID"] = ciafc.TemplateID;
ViewData["CategoryID"] = ciafc.CategoryID;
break;
}
Response.Redirect(Server.UrlDecode(ciafc.rtn));
return View();
}
答
它们不能是同一个名字的,只是因为普通的C#编译器规则与重载完全相同的名字和签名。请在第二次超载时使用[ActionName]属性:
[ActionName("AddCriteriaItem")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveCriteriaItem(CriteriaItemAddFormCollection ciafc)
答
错误来自C#编译器,它没有考虑方法重载的属性。而且,自定义属性对编译器不透明 - 它无法知道它们的含义。
在GET方法你没有真正增加项目无论如何,它更有意义,把它像ViewCriteriaItemAddForm()
您确实需要GET版吗?我的意思是它看起来像是在尝试将表单发布到GET方法,这并不合理。你真的想让它做'返回视图(新的CriteriaItemAddFormCollection())'而不是一个参数? – Ryan 2010-09-16 18:21:03
发表了一个不同的答案在这里类似的问题:http://*.com/questions/6348372/how-can-i-overload-asp-net-mvc-actions-based-on-the-accepted-http-verbs/10874897#10874897 – 2012-06-03 23:50:36