如何判断特定控制器操作是否需要POST或GET?

时间:2015-10-12 10:01:38

标签: asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

在使用ASP.NET Identity的标准MVC项目中,未经授权的请求被重定向到登录页面,并且ReturnUrl参数被添加到查询字符串中,以便在成功登录后可以进行进一步的重定向到最初请求的页面。

帐户控制器包含名为RedirectToLocal的方法,仅当ReturnUrl参数引用本地URL(即来自同一网站的页面)时,该方法才用于执行第二次重定向。它使用非常简单的方法来执行此检查,并且不会检查(例如)URL是有效的URL,还是可以将其路由到某个操作。

在我的情况下,有一些我绝对不想重定向的网址,例如注销页面(!)。我还想仅重定向到可以成功路由的网址。

为实现这一目标,我已更改代码以将URL转换为路径(使用类似于this的技术)。这让我得到一个RouteData对象,允许我检查控制器和动作名称(从而让我排除某些被阻止的动作)。

我想更进一步,并排除任何期望POST数据的控制器操作(因为您无法重定向到这些操作)。所以......

根据控制器名称和操作名称,如何判断这是GET还是POST操作?

我是否可以通过某种方式调用MVC框架通常会执行的路由/绑定,直到实际执行操作为止?

2 个答案:

答案 0 :(得分:1)

我不相信有内置的功能可以做你想要的。

我刚刚快速浏览了System.Web.Mvc.dll来源([HttpPostAttribute])(使用dotPeek),了解{{1}}的使用位置。坦率地说,所有与确定是否可以使用动作方法来提供传入请求的操作都是即时完成的。如同,该决定不涉及高级扩展方法或辅助类。至少,从我能看到的东西中没有任何明显的东西。在我看来,更像是用于确定动作方法是否可以为请求提供服务的内部方法/助手。

关于如何实现主要目标,我不太确定,但我想我会在扫描源代码后提到我发现的内容。当然,您可以自己查看源代码,您可能会发现我错过的内容。在这种情况下,请在此发布您的调查结果,以帮助将来可能有相同需求的其他人。

答案 1 :(得分:0)

可能的解决方案,将[Get],[Post]属性添加到操作中,并使用反射来过滤它们。

不知道框架中是否有一些机制构建,而不是反射和属性。

另一种解决方案。创建一个约定,所有操作都在操作名称中具有http方法名称,并使用regexp查找它。