asp.net核心 – Asp.Net核心从url获取RouteData值
发布时间:2020-12-16 00:25:11 所属栏目:asp.Net 来源:网络整理
导读:我正在一个新的Asp.Net核心mvc应用程序。我定义了一个具有自定义约束的路由,它从URL中设置当前的应用程序文化。我想通过创建一个自定义的IRequestCultureProvider来管理我的应用程序的本地化,如下所示: public class MyCustomRequestCultureProvider : IR
我正在一个新的Asp.Net核心mvc应用程序。我定义了一个具有自定义约束的路由,它从URL中设置当前的应用程序文化。我想通过创建一个自定义的IRequestCultureProvider来管理我的应用程序的本地化,如下所示:
public class MyCustomRequestCultureProvider : IRequestCultureProvider { public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) { var language= httpContext.GetRouteValue("language"); var result = new ProviderCultureResult(language,language); return Task.FromResult(result); } } 我的MyCustomRequestCultureProvider在每个请求都被击中,这是可以的。我的问题是,在MVC的管道中,我的提供者DetermineProviderCultureResult方法在路由进程之前被命中,所以httpContext.GetRouteValue(“language”)总是返回null。 在以前的MVC版本中,我可以通过这样做通过路由过程来手动处理我的url var wrapper = new HttpContextWrapper(HttpContext.Current); var routeData = RouteTable.Routes.GetRouteData(wrapper); var language = routeData.GetValue("language") 我现在找不到在新框架中做同样的事情的方法。另外,我想使用路由数据找出我的langugae,用一些字符串函数分析我的url字符串,以找到语言不是一个选项。 解决方法
没有一个简单的方法来做到这一点,ASP.Net团队还没有决定实现这个功能。 IRoutingFeature仅在MVC完成请求后才可用。
我能够组建一个解决方案,这个解决方案应该适合你。这将设置您传递到UseMvc()的路由以及所有属性路由以填充IRoutingFeature。完成之后,您可以通过httpContext.GetRouteValue(“language”);. Startup.cs public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory) { // setup routes app.UseGetRoutesMiddleware(GetRoutes); // add localization var requestLocalizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("en-US") }; requestLocalizationOptions.RequestCultureProviders.Clear(); requestLocalizationOptions.RequestCultureProviders.Add( new MyCustomRequestCultureProvider() ); app.UseRequestLocalization(requestLocalizationOptions); // add mvc app.UseMvc(GetRoutes); } 将路由移动到代理(用于重新使用),相同的文件/类: private readonly Action<IRouteBuilder> GetRoutes = routes => { routes.MapRoute( name: "custom",template: "{language=fr-FR}/{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "default",template: "{controller=Home}/{action=Index}/{id?}"); }; 添加新的中间件: public static class GetRoutesMiddlewareExtensions { public static IApplicationBuilder UseGetRoutesMiddleware(this IApplicationBuilder app,Action<IRouteBuilder> configureRoutes) { if (app == null) { throw new ArgumentNullException(nameof(app)); } var routes = new RouteBuilder(app) { DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),}; configureRoutes(routes); routes.Routes.Insert(0,AttributeRouting.CreateAttributeMegaRoute(app.ApplicationServices)); var router = routes.Build(); return app.UseMiddleware<GetRoutesMiddleware>(router); } } public class GetRoutesMiddleware { private readonly RequestDelegate next; private readonly IRouter _router; public GetRoutesMiddleware(RequestDelegate next,IRouter router) { this.next = next; _router = router; } public async Task Invoke(HttpContext httpContext) { var context = new RouteContext(httpContext); context.RouteData.Routers.Add(_router); await _router.RouteAsync(context); if (context.Handler != null) { httpContext.Features[typeof (IRoutingFeature)] = new RoutingFeature() { RouteData = context.RouteData,}; } // proceed to next... await next(httpContext); } } 你可能还要定义这个类呢 public class RoutingFeature : IRoutingFeature { public RouteData RouteData { get; set; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 在.NET 3.5 ASP.NET MVC应用程序中使用Goog
- asp.net-mvc – 尝试使用Moq模拟HtmlHelper时抛出MissingMe
- asp.net – RDLC报表中表的行颜色和替代行颜色
- asp.net-mvc – 应用程序级排队/网站流量管理
- asp.net-mvc – 在ASP.net MVC单元测试中访问ModelState错误
- asp.net – 查找上一页Url
- asp.net-mvc – NHaml是否具有content_for布局能力?
- asp.net-mvc-3 – 验证隐藏的字段
- asp.net – 为什么我的自定义404错误处理程序在部署到Web服
- asp.net – 估算Web应用程序峰值带宽需求的最准确方法是什么
推荐文章
站长推荐
- asp.net – MVC的最佳实践..使用接口的ViewModel
- asp.net – .Net System.Mail.Message添加多个“
- asp.net-core – aspnet核心应用程序中的Autofac
- JS_单个或多个文件上传_不支持单独修改
- asp.net-core – 无法解析“Microsoft.Applicati
- 为什么ASP.NET ListItem类是密封的?
- asp.net-mvc – redirectToAction()和View()之间
- 从VS发布到Azure时无法更改目标运行时
- asp.net-mvc – 已定义以下部分但尚未为布局页面
- asp.net – 使用Response.Redirect后,Ajax Updat
热点阅读