张贴并获得​​相同的方法签名

在我的控制器中,我有两个叫做“朋友”的动作。 执行的取决于它是否是“获取”与“后”。

所以我的代码片段如下所示:

// Get: [AcceptVerbs(HttpVerbs.Get)] public ActionResult Friends() { // do some stuff return View(); } // Post: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends() { // do some stuff return View(); } 

但是,这不能编译,因为我有两个具有相同签名(朋友)的方法。 我如何去创造这个? 我是否需要创build一个动作,但要区分“get”和“post”? 如果是这样,我该怎么做?

将第二个方法重命名为“Friends_Post”之类的其他方法,然后添加[ActionName("Friends")]属性到第二个方法。 因此,以POST作为请求types的Friend操作请求将由该操作处理。

 // Get: [AcceptVerbs(HttpVerbs.Get)] public ActionResult Friends() { // do some stuff return View(); } // Post: [ActionName("Friends")] [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends_Post() { // do some stuff return View(); } 

如果你真的只想要一个例程来处理这两个动词,试试这个:

 [AcceptVerbs("Get", "Post")] public ActionResult ActionName(string param1, ...) { //Fun stuff goes here. } 

一个潜在的警告:我正在使用MVC版本2.不知道这是否在MVC 1支持。AcceptVerbs的Intellisense文档应该让你知道。

尝试使用:

 [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] public ActionResult Friends() { // do some stuff return View(); } 

不完全确定是否是正确的方法,但我会用一个毫无意义的参数来区分sigs。 喜欢:

 // Get: [AcceptVerbs(HttpVerbs.Get)] public ActionResult Friends(bool isGet) { // do some stuff return View(); } // Post: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends() { // do some stuff return View(); } 

我知道这是丑陋的,但它的作品。

标记cagdas的回答是答案,因为它回答了我的问题。 但是,因为我不喜欢在我的项目中使用ActionName属性,所以我使用了不同的解决scheme。 我只是将FormCollection添加到“后”操作(最终更改方法签名)

 // Get: [AcceptVerbs(HttpVerbs.Get)] public ActionResult Friends() { // do some stuff return View(); } // Post: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends(FormCollection form) { // do some stuff return View(); } 

在Post方法中添加想要接收的参数。 也许是这样的:

 // Post: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends(string friendName, string otherField) { // do some stuff return View(); } 

如果你有一个复杂的types,像这样:

 // Post: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Friends(Friend friend) { // do some stuff return View(); } 

编辑:最好是使用更多types的方法来接收发布的项目,如上所述。

你的动作方法不能做同样的事情,否则就不需要写两个动作方法。 所以,如果语义不同,为什么不为行动方法使用不同的名字呢?

例如,如果您有一个“删除”操作方法,并且GET只是要求确认,则可以调用GET方法“ConfirmDelete”,POST方法调用“Delete”。

不知道这是否符合你的情况,但是当我遇到同样的问题时,总是这样做。