【问题标题】:How to Create URL friendly route and remove index如何创建 URL 友好路由并删除索引
【发布时间】:2018-12-24 10:19:32
【问题描述】:

我知道如何创建一个 URL 友好的路由,我也知道如何删除索引。但是我想知道如何将两者结合在一起?

使用本教程https://www.jerriepelser.com/blog/generate-seo-friendly-urls-aspnet-mvc/ 我能够添加以下代码以允许对 url 友好的路由。

routes.Add("ProductDetails", new SeoFriendlyRoute("drink/{id}",
    new RouteValueDictionary(new { controller = "Drink", action = "Index" }),
    new MvcRouteHandler()));

所以我的网址不是test.com/index/drink/1,而是现在变成test.com/index/drink/coke

我的下一组代码是从 url 中删除索引。

routes.MapRoute("DrinkRoute",
    "drink/{id}",
    new { controller = "Drink", action = "Index" });

这将成功地将test.com/index/drink/1 转换为test.com/drink/1

请问如何将两者结合在一起,以便我可以有一条路线将我引导到正确的控制器操作并显示test.com/drink/coke

路由配置

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    您也可以使用属性路由来实现相同的目的,这将提供对所需路由的更多控制。

    参考Attribute Routing in ASP.NET MVC 5

    首先,您需要通过在您的RouteConfig 中调用routes.MapMvcAttributeRoutes(); 来启用属性路由。确保它在基于约定的路由之前注册。

    public class RouteConfig {
        public static void RegisterRoutes(RouteCollection routes) {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            //Attribute routes
            routes.MapMvcAttributeRoutes();
    
            //Default convention-based routes
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    启用属性路由后,您可以通过注释您的操作和控制器来指定您的路由。

    [RoutePrefix("drink")]
    public class DrinkController : Controller {
        [HttpGet]
        [Route("{name}")] // GET drink/coke
        public ActionResult Index(string name) {
    
            //...use name to get model
    
            return View();
        }
    
        //..
    }
    

    上面的DrinkController.Index 操作现在映射到GET drink/coke,假设test.com 是控制器的主机,如您的示例所示。

    任何未由路由属性注释的控制器或操作将默认返回路由表中注册的基于约定的路由(如果有)。

    这意味着您可以为控制器定义基于约定和基于属性的混合路由。

    但是请注意,一旦您在控制器上使用属性路由,您将不得不在其所有公共操作中使用它。

    【讨论】:

    • 如果我们也想在这里传递 Id 但不想在 URL 中显示怎么办
    【解决方案2】:

    如果我对您的理解正确,您可以使用RouteConfig.cs 实现所需的行为:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "DrinkRoute",
                url: "drink/{id}",
                defaults: new { controller = "Drink", action = "Index" }
            );
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    在这种情况下,URL test.com/drink/coke 将被控制器 DrinkController.cs 和操作方法 Index 命中。 ID 将是coke。本控制器源码:

    public class DrinkController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
    

    【讨论】:

    • 嗨,Ivan,我不能简单地删除原来的默认地图路线。其他控制器依赖它。
    • 正如 Ivan 的编辑所示,您可以注册任意数量的路由模式,并且首先注册并匹配给定路由的将被使用。 Aka 你可以在url: "drink/{id}" 之前注册url: "drink/new" 并让id 为字符串类型,你永远不会看到第二条路线的方法与字符串“new”
    • 这个解决方案的主要问题是我必须将每个方法更改为现在采用string id 而不是int id。所以我认为更好的解决方案是重新配置路由,而不必更改控制器中的每个方法
    • 什么意思?您的示例网址是test.com/drink/coke,其中coke 显然是字符串。 “更改我的控制器中的每一个方法” - 非默认路由仅适用于一个控制器 - DrinkController,默认路由将应用于其他控制器。
    • 如果你看过我发布的jerriepelser.com/blog/generate-seo-friendly-urls-aspnet-mvc这个链接,你就会知道传递的是int而不是字符串。
    【解决方案3】:

    您可以删除 SEO 路由并让您的操作或控制器完全控制:

    public class DrinkssController : Controller
    {
        [Route("drink/{drinkName}")]
        public ActionResult Index(string drinkName)
        {
            var model = _drinks.First(x => x.name == drinkName);
            return View(model);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 2011-02-15
      • 2012-10-06
      • 2015-05-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多