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(); 
     } 
+1

您确实需要GET版吗?我的意思是它看起来像是在尝试将表单发布到GET方法,这并不合理。你真的想让它做'返回视图(新的CriteriaItemAddFormCollection())'而不是一个参数? – Ryan 2010-09-16 18:21:03

+0

发表了一个不同的答案在这里类似的问题: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

它们不能是同一个名字的,只是因为普通的C#编译器规则与重载完全相同的名字和签名。请在第二次超载时使用[ActionName]属性:

[ActionName("AddCriteriaItem")] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult SaveCriteriaItem(CriteriaItemAddFormCollection ciafc) 

错误来自C#编译器,它没有考虑方法重载的属性。而且,自定义属性对编译器不透明 - 它无法知道它们的含义。

在GET方法你没有真正增加项目无论如何,它更有意义,把它像ViewCriteriaItemAddForm()