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 – 可以重定向到新页面的Ajax.BeginForm
- asp.net-mvc – 如何在Html.RenderAction(MVC3)中发送模型对
- asp.net-mvc – 将返回文件的长时间运行进程
- asp.net – 角色提供程序是否按请求缓存?
- asp.net-mvc – 使用Razor在ASP.NET MVC 4中防止@ Html.Lab
- asp.net-mvc – Sitecore MVC – 如何在页面上处理多个表单
- asp.net-mvc – 如何在asp.net mvc中持久化查询字符串值?
- asp.net-web-api – mvc webapi cross domain post
- asp.net-mvc-3 – RedirectResult Object作为URL中的参数
- asp.net-mvc – 如何将数据从AuthorizeAttribute传递给Cont
- asp.net-web-api – WebApi2属性路由404
- asp.net-mvc – 如何设置html.EditorFor helper的
- asp.net-mvc – 如何覆盖Orchard CMS中导航区域的
- asp.net – 无法在Web服务器上启动调试.无法连接
- asp.net-mvc – 使用模型对象更新ModelState
- asp.net-mvc – 在ASP.NET MVC中的NHibernate会话
- asp-classic – 如何在VBScript中逐行读取CSV文件
- asp.net-mvc – 强大的html帮助程序,具有不同的g
- asp.net-mvc-4 – IIS 7.5上的ASP.NET MVC 4,返回
- .net – ListView中Bind语句中的格式化日期
