【问题标题】:ASP.NET MVC: Member with the same signature already exists errorASP.NET MVC:具有相同签名的成员已存在错误
【发布时间】:2011-04-13 07:14:36
【问题描述】:

我有两个同名的控制器。一个带有 [get],另一个带有 [post]。这两者执行完全不同的功能。为什么不能同名?

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

【问题讨论】:

  • 您真的需要 GET 版本吗?我的意思是,您似乎正在尝试将表单发布到 GET 方法,这实际上没有任何意义。你真的想让它做return View(new CriteriaItemAddFormCollection())而不带参数吗?
  • 在这里发布了对类似问题的不同答案:stackoverflow.com/questions/6348372/…

标签: c# asp.net-mvc-2


【解决方案1】:

由于正常的 C# 编译器规则对于具有完全相同的名称和签名的重载,它们不能是相同的名称。在第二次重载时使用 [ActionName] 属性:

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

【讨论】:

    【解决方案2】:

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

    无论如何,您实际上并没有在 GET 方法中添加项目 - 将其称为 ViewCriteriaItemAddForm() 之类的名称更有意义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多