已经定义了一个与相同参数类型的成员'Create'。

14

我有两种方法,根据http动词进行区分:

public class ProductImageController : Controller
{
     [HttpGet]
     public ViewResult Create(int productId)
          {
             return View(productId);
          }

      [HttpPost]
      public ViewResult Create(int productId)
          {
          }
}

但是出现了错误:

已经定义了一个与相同参数类型的 'Create' 成员

2个回答

28

在同一作用域内,不能有相同签名的多个方法,即返回类型和参数类型相同。

编辑-看起来你需要使用这个:相关问题

public class ProductImageController : Controller
{
     [HttpGet]
     public ViewResult Create(int productId)
     {
         return View(productId);
     }

    [HttpPost]
    [ActionName("Create")]
    public ViewResult CreatePost(int productId)
    {
        //return a View() somewhere in here
    }
}

亲爱的 @chrise,在MVC中,我们可以通过HTTP动词进行区分。 - Mohammadreza
1
我通常只是在签名中添加一个额外的变量。在大多数情况下,我会添加, string differentsignature。这也解决了问题,但可能略显不太优雅。 - Flater
这应该是被选中的答案,我以前从未见过 ActionName 属性。 - keeehlan

3
修改 post 动作方法如下:
[HttpPost]
public ViewResult Create(FormCollection formValues)
{
       var productId = formValues["productId"];
}

或者

[HttpPost]
public ViewResult Create(int  productId, FormCollection formValues)
{
 //still using productId, formValues is just an additional parameter 
 //that doesn't need to be implemented.
}

亲爱的@Lin,谢谢你,但是为什么我们可以在同一个控制器中使用相同签名但不同HTTP动词(POST和GET)的Index方法,但对于Create却不行?!! - Mohammadreza
2
将传入的浏览器请求映射到指定的MVC控制器操作需要MVC路由引擎和HTTP请求。 默认情况下,操作方法参数的值从请求的数据集合中检索。 首先,当传入的浏览器请求与“RouteConfig.cs”中的路由规则匹配时,它将根据Http方法(GET、POST等)选择操作方法。 但是,如果在操作方法中具有相同的名称和参数类型相同,仅Http方法不同, MVC路由引擎无法理解要执行哪个操作方法。 - Lin
我从未见过任何一个Action方法包含具有相同签名但不同HTTP动词(POST和GET)的Index方法,而且能够在没有错误的情况下通过构建。 如果您有示例,我想看看。然后也许我们可以找出问题所在。 - Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接