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