在ASP.Net Core中,如果直接在Middleware中获取RouteData返回的是空值,这是因为RouterMiddleware还没执行。 但有些情况下需要获取RouteData,这要怎么做呢? public async Task Invoke(HttpContext context) { var routeData = context.GetRouteData() } TemplateMatcher 使用它可以将URL按路由Template解析成RouteData。所以我们可以使用它来获取RouteData。 view=aspnetcore-2.1 原文链接:http://www.zkea.net/codesnippet/detail/middleware-routedata.html
Request.RequestContext.RouteData.Values["attrvalues"].ToString() : "0"; 【6】获取 端口: Request.Url.Port 二、当前controller、action的获取 RouteData.Route.GetRouteData(this.HttpContext).Values["controller"] RouteData.Route.GetRouteData (this.HttpContext).Values["action"] 或 RouteData.Values["controller"] RouteData.Values["action"] 如果在视图中可以用 ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"] ViewContext.RouteData.Route.GetRouteData (this.Context).Values["action"] 或 ViewContext.RouteData.Values["controller"] ViewContext.RouteData.Values
<Router AppAssembly="@typeof(App).Assembly"> <Found Context="<em>routeData</em>"> <RouteView RouteData=" @routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector 我们添加了一个跳转的延时操作 <Router AppAssembly="@typeof(App).Assembly" OnNavigateAsync="Callback"> <Found Context="<em>routeData</em> "> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <PageTitle>Not found</PageTitle
另外两个则是作为路由解析的输出,一个是代表存放路由参数的RouteData对象,另一个则是作为请求处理器的RequestDelegate对象,对应的属性分别是RouteData和Handler。 具体来说,我们为某个RouteData当前的状态创建一个快照,在后续的某个时刻我们利用这个快照让这个RouteData对象回复到当初的状态。 当我们调用其Restore方法的时候,目标RouteData将会恢复到快照创建时的状态。我们可以直接调用RouteData的PushState为它自己创建一个快照。 1: RouteData routeData = new RouteData(); 2: RouteDataSnapshot snapshot = routeData.PushState(null, routeData.Values.Any()); 10: Debug.Assert(!routeData.DataTokens.Any()); 11: Debug.Assert(!
RouteContext上下文的RouteData最终会被附加到代表当前请求上下文的HttpContext上,而具体承载这个RouteData的就是这个名为RoutingFeature的特性。 如下面的代码片段所示,这个接口通过属性RouteData来保存最终附加到HttpContext的RouteData。 1: public interface IRoutingFeature 2: { 3: RouteData RouteData { get; set; } 4: } 5: 6: public class RoutingFeature : IRoutingFeature 7: { 8: public RouteData RouteData { get; set 在这之前它会从RouteContext上下文中提出出RouteData,然后据此创建一个RoutingFeature对象并附加到HttpContext上面。
RouteData { get; set; } 5: } 二、Route和RouteTable RouteData具有一个类型为RouteBase的Route属性,表示当前路由表中与当前请求匹配的路由对象 routeData = new RouteData(); 15: foreach (var item in variables) 16: { = routeData) 9: { 10: return routeData; 11: } 12: routeData = RouteTable.Routes.GetRouteData(httpContext); 13: if (null == routeData) 14: 如果得到的RouteData不为空,根据该对象本身和和之前得到的HttpContextWrapper对象创建一个表示当前请求上下文的RequestContext对象,将其作为参数传入RouteData的
如果得到的RouteData不为空,则返回之。 = routeData) 14: { 15: return routeData; 16: } 17: routeData = RouteTable.Routes.GetRouteData(httpContext); 11: if (null == routeData routeData = this.RequestContext.RouteData; 19: var controller = this.ControllerFactory.CreateController routeData = requestContext.RouteData; 6: string controllerType = string.Format("{0}Controller
具体来说,我们为某个RouteData当前的状态创建一个快照,在后续的某个时刻我们利用这个快照让这个RouteData对象回复到当初的状态。 当我们调用其Restore方法的时候,目标RouteData将会恢复到快照创建时的状态。我们可以直接调用RouteData的PushState为它自己创建一个快照。 虽然我们在后续步骤中修改了这个RouteData的状态,但是一旦我们调用了这个RouteDataSnapshot对象的Restore方法,这个RouteData将重新恢复到最初的状态。 1: RouteData routeData = new RouteData(); 2: RouteDataSnapshot snapshot = routeData.PushState(null, routeData.Values.Any()); 10: Debug.Assert(!routeData.DataTokens.Any()); 11: Debug.Assert(!
c={0}&a={1}", routeData["{controller}"], routeData["{action}"])); // 入口二:指定MvcHandler ) { this.routeData = routeData; } public void ProcessRequest(HttpContext = routeData }; controller.Execute(requestContext); } public = routeData }; controller.Execute(requestContext); } 这里由于要使用到RouteData这个路由表的Dictionary { get; set; } } 可以看出,其实就是简单地包裹了一下,添加了一个RouteData的路由表属性。
获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); 获取Action名称: ViewContext.RouteData.Values ["action"].ToString(); 获取路由参数值: ViewContext.RouteData.Values[名称].ToString(); 如:ViewContext.RouteData.Values ["ID"].ToString(); 获取ID的值 获取area名称 在代码中: ControllerContext.RouteData.DataTokens["area"] 在View中: ViewContext.RouteData.DataTokens ["area"] 1 var action = ViewContext.RouteData.Values["Action"].ToString().ToLower(); 2 var controllerName = ViewContext.RouteData.Values["controller"].ToString().ToLower(); 3 var areaName = ViewContext.RouteData.DataTokens
_Imports).Assembly }" OnNavigateAsync="Callback"> <Found Context="<em>routeData</em>"> <RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" /> <FocusOnNavigate RouteData ="routeData" Selector="h1" /> </Found> </Router> @code { private async Task Callback(NavigationContext _Imports).Assembly }" OnNavigateAsync="Callback"> <Found Context="<em>routeData</em>"> <RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" /> <FocusOnNavigate RouteData
[源代码从这里下载] 如下面的代码片断所示,GetVirtualPath定义了两个GetVirtualPath方法重载,它们共同的参数requestContext和values分别表示请求上下文(RouteData 路由对象针对GetVirtualPath方法而进行的路由匹配只要求URL模板中定义的变量的值都能被提供,而这些变量值具有三种来源,分别是路由对象定义的默认变量值、指定RequestContext的RouteData Page 2: { 3: protected void Page_Load(object sender, EventArgs e) 4: { 5: RouteData routeData = new RouteData(); 6: routeData.Values.Add("areaCode","0512"); 7: routeData.Values.Add = routeData; 11: 12: RouteValueDictionary values = new RouteValueDictionary(); 13:
App.razor中设置跳转等待过程中的界面,我们做一个延时的界面看看实际的效果 <Router AppAssembly="@typeof(App).Assembly"> <Found Context="<em>routeData</em> "> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <PageTitle>Not found "> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <PageTitle>Not found</PageTitle
["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine ["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine ["controller"]; var actionName = context.RouteData.Values["action"]; //获取异常信息 ["controller"]; var actionName = context.RouteData.Values["action"]; ["controller"]; var actionName = context.RouteData.Values["action"]; //代码执行到这里
ASP.NET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象,而这个过程是通过自定义的UrlRoutingModule对HttpApplication RouteData中已经包含了目标Controller的名称,现在我们来进一步分析真正的Controller对象是如何被激活的。我们首先需要了解一个类型为MvcRouteHandler的类型。 当GetRouteData方法被执行后,Route的RouteHandler属性值将反映在得到的RouteData的同名属性上。 由于RouteData的RouteHandler来源于对应Route对象的RouteHandler,而后者在默认的情况下是一个MvcRouteHandler对象,所以默认情况下用于处理HTTP请求的就是这么一个 此外我们还需要得到类型的命名空间,而命名空间具有两个来源,即RouteData和当前ControllerBuilder。
httpContext.Response.ContentType = "text/html; charset=utf-8"; 19 var routeData = new RouteData(); 20 routeData.Values["controller"] = "Sys"; 21 routeData.Values NotFound"; 22 var requestContext = new RequestContext(new HttpContextWrapper(httpContext), routeData
= new RequestContext(contextWrapper, routeData); 10: IHttpHandler handler = routeData.RouteHandler.GetHttpHandler 对于被拦截的请求,UrlRoutingModule利用注册的路由表对其进行匹配和解析,进而得到一个包含所有路由信息的RouteData对象。 routeData = new RouteData(); 30: routeData.RouteHandler = this.RouteHandler; 31: 在匹配的情况下我们创建并返回相应的RouteData对象,否则直接返回Null。 生成的URL连同当前页面的RouteData的属性通过如下所示的HTML输出来。
var context = new RouteContext(httpContext); context.RouteData.Routers.Add(_router); public class RouteContext { private RouteData _routeData; public RequestDelegate Handler ; public HttpContext HttpContext ;//简单的赋值 public RouteData RouteData; } ⑥调用_router(也就是RouteCollection)的RouteAsync(context context.Handler处理HttpContext; httpContext.Features[typeof(IRoutingFeature)] = new RoutingFeature() { RouteData = context.RouteData, }; await context.Handler(context.HttpContext); 三、其他 由于文章写的比较早各种原因一直没有写完
经过前一篇文章.NET/ASP.NET Routing路由(深入解析路由系统架构原理) 的讲解,我们对ASP.NETRouting路由系统的整个运行机制有了一个基本的了解;当我们能清楚的知道Url是如何被解析成RouteData MvcHandler对象作为源头调用起来的,也就是说,当我们穿过UrlRoutingModule对象后,并且成功的获取到应用框架配置的路由数据后,下面将进入IHttpHandler接口,而这个接口真是我们初始化RouteData ASP.NETMVC应用框架的范围,我们可以简单的将路由解析(UrlRoutingModule)的过程视为将请求的Url(含有数据的Url)与我们配置的Url模板进行模式匹配的过程,得出匹配后的Url数据(RouteData ),然后将Url数据并且连同当前请求上下文一起封装成RequestContext对象(RouteData、HttpContextBase)传入到Controller解析的环节,也就是MvcHandler );而控制器的执行必须需要RouteData中的有关Controller数据对象,也就是从请求Url中通过模式匹配出来的{Controller}部分的字符串; ControllerBase定义了Controller
实例 RouteData routeData = this.RouteCollection.GetRouteData(context); if (routeData ! = null) { // 再从RouteData中获取MVCRouteHandler IRouteHandler routeHandler = routeData.RouteHandler ; var route = RouteTable.MatchRoutes(requestUrl, out routeData); if (route == ; public MvcHandler(IDictionary<string, object> routeData) { this.routeData var controllerName = routeData["controller"].ToString(); // 借助控制器工厂创建具体控制器实例