在控制器类之外获取IRouter实例的最简单方法

时间:2016-10-27 09:50:04

标签: c# asp.net asp.net-core-mvc

我有一个使用Mvc和OpenID Connect Auth。

的ASP.NET Core应用程序

在OpenID事件处理程序中,我想处理用户拒绝auth服务器上的同意屏幕的情况,并且我想将用户重定向到特定页面,使用路由器生成重定向URL。我只是不喜欢硬编码的网址。

所以,我必须实现自定义的UseMvc方法,该方法通过out-parameter将IRouter返回给调用方法。然后我可以将它保存到Startup方法的属性中并使用其中的每个方法。

问题是我的解决方案对我来说似乎不对,就像应该有一种更简单的方法来完成我想要的。只是好奇是否有人可以指出我正确的方向。

我的代码是here。我提到的自定义方法是here。它被称为there,因此可以进一步使用已解析的路由器here

1 个答案:

答案 0 :(得分:0)

只要代码在路由中间件之后运行(由UseMvc()添加,就可以访问路由器。因此,在MVC之前运行的任何自定义中间件都无法访问路由。

基本上任何类型的MVC结构(如控制器,过滤器,标记助手等)都可以像以下任何一样访问路由器:

var routers = httpContext.GetRouteData().Routers;
var routers httpContext.Features.Get<IRoutingFeature>().RouteData.Routers;

但是如果您的代码已经是MVC构造,那么最好使用IUrlHelper使用以下任何方法生成URL:

urlHelper.Action("Index", "Home");

IUrlHeleper可以在多个位置随时使用(例如Url派生类中的Controller属性),但您也可以使用this question中的DI来获取它。 (只要使用DI解析它的代码在路由中间件之后运行!)