大佬教程收集整理的这篇文章主要介绍了asp.net核心 – Asp.Net核心从url获取RouteData值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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字符串,以找到语言不是一个选项。
我能够组建一个解决方案,这个解决方案应该适合你。这将设置您传递到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核心 – Asp.Net核心从url获取RouteData值全部内容,希望文章能够帮你解决asp.net核心 – Asp.Net核心从url获取RouteData值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。