gpt4 book ai didi

asp.net-mvc - 使用 MVC 和 ASP.Net Core 重写动态 url

转载 作者:行者123 更新时间:2023-12-03 22:14:59 26 4
gpt4 key购买 nike

我正在使用 ASP.Net Core 和 MVC 6 重写我的 FragSwapper.com 网站(目前在 Asp 2.0 中!),我正在尝试做一些我通常必须打破 URL Re-Write 工具和数据库代码的事情和一些重定向,但我想知道在 ASP.Net Core 中是否有“更好”的方法可以使用 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...

    怎么做:去 Controller ,等等......这一切也都有效。
  • 棘手的一个:URL 访问站点:[root]/SomeString

    怎么办:访问数据库并执行一些逻辑来确定是否找到事件 ID。如果我这样做,我会转到 [Event] Controller 和 [Index] View 以及我找到的任何内容的 [ID]。如果不是,我尝试查找主机 ID 并使用我找到的 [ID] 转到 [Home] Controller 和 [Organization] View。如果我没有找到事件或主机,请转到通常的 [Home] Controller 和 [Index] View (没有 [ID])。

  • 这里最大的问题是我想重定向到 2 个不同 Controller 中的三个完全不同的 View 之一。

    所以底线是当用户来到我的站点的根目录并且上面有一个“/Something”并且该逻辑是数据库驱动的时,我想做一些逻辑。

    如果您理解这个问题,您现在可以停止阅读......如果您觉得有必要了解为什么需要所有这些逻辑,您可以继续阅读以获得更详细的上下文。

    My site has basically two modes: Viewing an Event and Not Viewing an Event! There are usually 4 or 5 events running at an one time but most users are only interested in one event but it's a DIFFERENT event every 4 months or so..I have a [Host] entity and each Host holds up to 4 events a year, one at a time. Most users only care about one Host's events.

    I'm trying to avoid making a user always go to an event map and find the event and click on it since I have a limit to how many times I can show a map (for free) and it's really not necessary. 99.99% of the time a user is on my site they are on an Event screen, not my Home screens, and are interested in only one event at a time. In the future I want to code it so if they come to my website they go right to their event or a new event from their favorite host so I can avoid a LOT of clicks and focus my [Home] controller pages for newbs...but I don't have auto-login working yet so that's on the back burner.

    But for now I want hosts to always have the same url for their events: FragSwapper.com/[Host Abbreviation] ...and know it will always go to their current event which has a different ID every 4 months!!!

    Crazy...I know...but technically very easy to do, I just don't know how to do it properly in MVC with how things are done.

    最佳答案

    更新:ASP.Net Core 1.1

    根据release notes , 一个新的 RewriteMiddleware 已经被创造了。

    这提供了几种不同的预定义重写选项和实用程序扩展方法,最终可能会修改请求路径,就像在此答案中所做的那样。例如,参见 RewriteRule 的实现

    具体到 OP 问题,您需要实现自己的 IRule类(从头开始或扩展现有的类,如 RewriteRule ,它基于正则表达式)。你可能会用一个新的 AddMyRule() 来补充它。 RewriteOptions 的扩展方法.

    您可以创建自己的middleware并将其添加到 MVC 路由之前的请求管道中。

    这允许您在评估 MVC 路由之前将代码注入(inject)管道。这样,您将能够:

  • 检查传入请求中的路径
  • 在数据库中搜索具有相同值的 eventId 或 hostId
  • 如果找到事件或主机,则将传入请求路径更新为 Event/Index/{eventId}Home/Organization/{hostId}
  • 让下一个中间件(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 中的管道中方法,确保在路由和 MVC 中间件之前添加它们:
            app.UseMiddleware<EventIdUrlRewritingMiddleware>();
    app.UseMiddleware<HostIdUrlRewritingMiddleware>();
    app.UseMvc(routes =>
    {
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
    });

    使用此配置:
  • /转到HomeController.Index行动
  • /Home/About转到HomeController.About行动
  • /Event/Index/1转到EventController.Index操作 ID=1
  • /someEventId转到EventController.Index Action ,id=someEventId

  • 请注意,不涉及 http 重定向。打开时 /someEventId在浏览器中有一个 http 请求,浏览器将显示 /someEventId在地址栏中。 (即使在内部更新了原始路径)

    关于asp.net-mvc - 使用 MVC 和 ASP.Net Core 重写动态 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179304/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com