GET和POST方法在同一个Controller中具有相同的Action名称

为什么这是不正确的?

{ public class HomeController : Controller { [HttpGet] public ActionResult Index() { Some Code--Some Code---Some Code return View(); } [HttpPost] public ActionResult Index() { Some Code--Some Code---Some Code return View(); } } 

我怎样才能有一个控制器回答一件事什么时候“得到”和一个什么时候“张贴”?

既然你不能有两个具有相同名字和签名的方法,你必须使用ActionName属性:

  [HttpGet] public ActionResult Index() { Some Code--Some Code---Some Code return View(); } [HttpPost] [ActionName("Index")] public ActionResult IndexPost() { Some Code--Some Code---Some Code return View(); } 

另请参阅“方法如何成为行动”

虽然ASP.NET MVC将允许你有两个具有相同名称的动作,.NET不会允许你有两个具有相同签名的方法 – 即相同的名称和参数。

您将需要以不同的方式命名方法使用ActionName属性告诉ASP.NET MVC他们实际上是相同的行动。

也就是说,如果你正在谈论一个GET和一个POST,这个问题可能会消失,因为POST操作将比GET更多的参数,因此是可区分的。

所以,你需要:

 [HttpGet] public ActionResult ActionName() {...} [HttpPost, ActionName("ActionName")] public ActionResult ActionNamePost() {...} 

要么,

 [HttpGet] public ActionResult ActionName() {...} [HttpPost] public ActionResult ActionName(string aParameter) {...} 

我喜欢接受我的POST动作的表单post,即使我不需要它。 对于我来说,只是觉得你应该发布一些东西

 public class HomeController : Controller { public ActionResult Index() { //Code... return View(); } [HttpPost] public ActionResult Index(FormCollection form) { //Code... return View(); } } 

要回答你的具体问题,你不能在同一个类中有两个具有相同名字和相同参数的方法; 使用HttpGet和HttpPost属性不区分这些方法。

为了解决这个问题,我通常包括你发布的表单的视图模型:

 public class HomeController : Controller { [HttpGet] public ActionResult Index() { Some Code--Some Code---Some Code return View(); } [HttpPost] public ActionResult Index(formViewModel model) { do work on model -- return View(); } } 

您不能有多个具有相同名称的操作。 你可以添加一个参数到一个方法,这将是有效的。 例如:

  public ActionResult Index(int i) { Some Code--Some Code---Some Code return View(); } 

有几种方法可以做只有请求动词才有区别的动作。 我最喜欢的,我认为最容易实现的是使用AttributeRouting包。 一旦安装完成,只需在你的方法中添加一个属性如下:

  [GET("Resources")] public ActionResult Index() { return View(); } [POST("Resources")] public ActionResult Create() { return RedirectToAction("Index"); } 

在上面的例子中,这些方法有不同的名字,但是这两种情况下的动作名称都是“资源”。 唯一的区别是请求动词。

这个包可以像这样使用NuGet来安装:

PM> Install-Package AttributeRouting

如果你不想依赖于AttributeRouting包,你可以通过编写一个自定义的动作select器属性来完成。

不能多个动作相同的名称和相同的参数

  [HttpGet] public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(int id) { return View(); } 

尽pipeint id不被使用

你收到了这个问题的好答案,但我想补充我的两分钱。 您可以使用一种方法并根据请求types处理请求:

 public ActionResult Index() { if("GET"==this.HttpContext.Request.RequestType) { Some Code--Some Code---Some Code for GET } else if("POST"==this.HttpContext.Request.RequestType) { Some Code--Some Code---Some Code for POST } else { //exception } return View(); }