使用HTTP动作谓词的ASP.Net MVC路由

时间:2011-05-17 07:31:44

标签: asp.net-mvc-2 routing actionmethod

我正在编写实现ASP.NET Web应用程序,当我针对特定网址调用时,我想根据请求是GET还是POST来调用不同的操作方法。

我尝试了两种不同的方法 - 首先,我从一个带有以下操作方法的控制器开始:

<HttpGet>
Public Function Index() as ActionResult
...
End Function

<HttpPost>
Public Function Index() as ActionResult
...
End Function

...然后注册一个路由,将.action设置为Url的“Index”。这不会编译,因为这两个函数具有相同的签名。

接下来我尝试将Post例程的名称更改为“Subscribe”,但当然这需要我提供两个不同的路由到路由表(以便指定新的操作方法名称)。如果我这样做,我会发现第二个被第一个取消了。

我现在正在考虑回到我原来的想法,但是为它提供一个虚拟参数,并将其指定为UrlParameter.Optional。通过将此作为post例程中的参数,这将创建一个新的方法签名,我希望这样可以。

虽然它闻起来有点脏 - 所以我想知道其他人会怎么做呢?

马丁。

聚苯乙烯。我现在尝试了肮脏的黑客,它确实有效。仍然有兴趣听取别人的意见。

2 个答案:

答案 0 :(得分:3)

重命名操作并使用ActionNameAttribute

<HttpGet>
<ActionName("Index")>
Public Function IndexGet() as ActionResult
...
End Function

<HttpPost>
<ActionName("Index")>
Public Function IndexPost() as ActionResult
...
End Function

但是我不知道你的POST方法会做什么,因为它没有得到任何数据。 POST操作通常会处理一些后期数据,因此它可能也需要一些参数。当你添加它们时,你的两个方法可以共享相同的名称,因为它们的签名会有所不同(一个没有参数,一个没有参数)。

答案 1 :(得分:1)

只是简短的说明,以突出我最终采取的实际方法 - 尽管罗伯特上面的答案也完全有效......

我最终在MapRoute函数的约束参数上使用了“.httpMethodConstraint”属性,然后为所涉及的各种方法类型提供了单独的路径。

我认为,罗伯特的解决方案通常是一种更好的方法 - 但对于我的具体问题,采用映射不同路线的方法是我的技术主管的首选解决方案。

其中没有太多 - 除非我在大型网站上工作,否则我会对创建路由的负载和负载有所保留,因为它们会很快混淆。

欢呼帮助......