asp.net-mvc – 使用MVC和ASP.Net Core重写动态URL
我正在用ASP.Net Core和MVC 6重新编写我的FragSwapper.com网站(目前在Asp 2.0中!)我正在尝试做一些我通常需要打破URL重写工具和db代码的东西和一些重定向,但我想知道是否有一个“更好”的方式在ASP.Net核心可能与MVC路由和重定向.
这是我的场景…… > URL访问网站:[root] 怎么做:转到通常的[Home] Controller和[Index] View(没有[ID]). ……它现在这样做: app.UseMvc(routes => { routes.MapRoute( name: "default",template: "{controller=Home}/{action=Index}/{id?}"); }); > URL访问网站:[root] / ControllerName / … yada yada … 怎么做:转到控制器等…这一切都有效. 怎么做:访问数据库并做一些逻辑来决定我是否找到了一个事件ID.如果我这样做,我会转到[事件]控制器和[索引]视图和我找到的任何[ID].如果不是,我尝试找到主机ID并转到[主页]控制器和[组织]视图,我找到了[ID].如果我没有找到并且事件或主机转到通常的[Home] Controller和[Index] View(没有[ID]). 这里最大的问题是我想在2个不同的控制器中重定向到三个完全不同的视图之一. 所以底线是我想在用户访问我网站的根目录时做一些逻辑,并且在其上有一个“/ Something”,并且该逻辑是数据库驱动的. 如果你理解了这个问题,你现在就可以停止阅读……如果你觉得需要理解为什么需要所有这些逻辑,你可以继续阅读更详细的背景.
解决方法
更新:ASP.Net Core 1.1
根据release notes,创建了一个新的 这提供了几种不同的预定义重写选项和实用程序扩展方法,这可能最终修改请求路径,就像在此答案中完成的那样.例如,参见 具体到OP问题,你需要实现自己的IRule类(从头开始或扩展现有的类,如RewriteRule,它基于正则表达式).您可以使用RewriteOptions的新AddMyRule()扩展方法来补充它. 您可以创建自己的middleware并在MVC路由之前将其添加到请求管道. 这允许您在评估MVC路由之前将代码注入管道.通过这种方式,您将能够: >检查传入请求中的路径 例如,create your own EventIdUrlRewritingMiddleware中间件将尝试将传入请求路径与数据库中的eventId进行匹配.如果匹配,它会将原始请求路径更改为Event / Index / {eventId}: public class EventIdUrlRewritingMiddleware { private readonly RequestDelegate _next; //Your constructor will have the dependencies needed for database access public EventIdUrlRewritingMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { var path = context.Request.Path.ToUriComponent(); if (PathIsEventId(path)) { //If is an eventId,change the request path to be "Event/Index/{path}" so it is handled by the event controller,index action context.Request.Path = "/Event/Index" + path; } //Let the next middleware (MVC routing) handle the request //In case the path was updated,the MVC routing will see the updated path await _next.Invoke(context); } private bool PathIsEventId(string path) { //The real midleware will try to find an event in the database that matches the current path //In this example I am just using some hardcoded string if (path == "/someEventId") { return true; } return false; } } 然后按照相同的方法创建另一个类HostIdUrlRewritingMiddleware. 最后,在Startup.Configure方法中将新的中间件添加到管道中,确保在Routing和MVC中间件之前添加它们: app.UseMiddleware<EventIdUrlRewritingMiddleware>(); app.UseMiddleware<HostIdUrlRewritingMiddleware>(); app.UseMvc(routes => { routes.MapRoute( name: "default",template: "{controller=Home}/{action=Index}/{id?}"); }); 使用此配置: > /转到HomeController.Index操作 请注意,没有涉及http重定向.在浏览器中打开/ someEventId时,只有一个http请求,浏览器将在addess栏中显示/ someEventId. (即使内部原始路径已更新) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 可以添加到显示/ EditorTemplates ASP.NE
- asp.net-mvc – 将CurrentUICulture传递给ASP.NET MVC 3.0中
- asp.net – DotNetNuke模块Page_Load触发两次
- asp.net-mvc – 在MVC5中呈现Razor的部分视图
- ASP.net MVC中的自定义表单身份验证/授权方案
- asp.net – 如何在MVC 3中设置图表系列颜色?
- 通过asp.net 4.0中的“EnableViewState”和“ViewStateMode
- asp.net – 如果我不限制文件上传到网络服务器的最大请求长
- asp.net-mvc – 数以千计的重定向不好SEO?
- asp.net-mvc – 从URL mvc中省略控制器名称