【问题标题】:ASP.NET Core Routing with UrlRecord slug带有 UrlRecord slug 的 ASP.NET Core 路由
【发布时间】:2017-11-03 11:41:08
【问题描述】:

我在一个商业平台上工作,想要 SEO 友好的 URL,我已经创建了以下路线

            routes.MapRoute(
                name: "Common",
                template: "{generic_se_name}",
                defaults: new { controller = "Common", action = "Show" }
            );
            routes.MapRoute(
                name: "Product",
                template: "{productName}",
                defaults: new {controller = "Product", action = "Show"}
            );
            routes.MapRoute(
                name: "Category",
                template: "{categoryName}",
                defaults: new { controller = "Catalog", action = "Show" }
            );
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

但是,当我致电 http://localhost/creme 时,它会进入公共区域,这就是我期望发生的事情。在那,我查看数据库以确定它是产品还是类别,如果它是我做的产品

 public IActionResult Show(string generic_se_name)
    {
        var type = db.UrlRecords.FirstOrDefault(x => x.Slug == generic_se_name);
        if (type != null)
        {
            switch (type.EntityType)
            {
                case "Product":
                    return RedirectToRoute("Product", new {productName = generic_se_name });
                case "Category":
                    return RedirectToRoute("Category", new { categoryName = generic_se_name });
            }
        }
        return BadRequest();
    }

但即使我说它应该重定向到产品路由,它也会一直调用通用路由。

我做错了什么?

问候克劳斯

【问题讨论】:

标签: .net asp.net-mvc asp.net-core


【解决方案1】:

它一直调用你的 Common 路由的原因是它总是匹配的。

每当您使用RedirectToRoute 时,路由中间件将再次运行,并且第一个匹配的路由将被使用。

在您的情况下,您似乎拥有一个“非贪婪的包罗万象”的路线模板,因为您根本没有任何限制。因此,无论用户在主机名(产品/类别/品牌)之后放置什么,它都将始终映射到您的“generic_se_name”参数。真正的“包罗万象”路由会在参数前使用 *,这将捕获所有路由,例如 host/cream/flavour 并且您的 generic_se_param 将接收它们组合为 param="cream/flavour"

基本解决方案:

如果您想重定向到正确的操作处理程序,您应该按照 Phil Cooper 所说的进行操作并使用 redirectToAction,您可以在其中指定要使用的控制器和操作。但是,使用该解决方案,您将有效地被重定向到主机/控制器/操作,这似乎是您想要避免的。

可能更符合您要求的解决方案:

您可以根据从路由中获得的实体类型简单地在内部进行重定向。所以不用调用RedirectToRoute,你可以简单地调用你的处理程序,它会在控制器中、服务中或你决定放置它的任何地方。然后,您的generic_se_param 只需要一条“包罗万象”的路线。

作为参考,我建议阅读以下页面:

路由基础: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing 常规和属性路由(到控制器操作) https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

(我猜你已经看过并且可能已经发现了你的问题,但我想把它放在这里,以防有人在来这里搜索与你类似的东西之前不会偶然发现官方文档)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2016-11-19
    • 2020-06-15
    • 1970-01-01
    • 2023-03-30
    • 2012-02-22
    • 2016-01-02
    相关资源
    最近更新 更多