asp.net mvc 中的 slug 路由

Routing by slug in asp.net mvc

我有一个控制器操作,如下所示:

public ActionResult Content(string slug)
{
    var content = contentRepository.GetBySlug(slug);

    return View(content);
}

我希望这种 url 被路由到我的操作:

http://localhost/slug-of-my-content

这是我的 RegisterRoutes 方法:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

        routes.MapRoute(
           name: "GetContent",
           url: "{slug}",
           defaults: new { controller = "Page", action = "Content", slug = "" }
           );
    }

但是它不起作用,我做错了什么?

谢谢,

对于动态路由,您可以使用:

routes.MapRoute(
    name: "PageName",
    url: "{pageName}",  
    defaults: new { controller = "Page", action = "Content", pageName = "defaultPage" }
);

它将通过 "Page" 控制器中的操作 "Content" 映射到 ~/Pagename:

 public ActionResult Content(string pageName)
    {
        ViewBag.Message = pageName;
        return View();
    }

1 将 slug 路由放在默认路由之上,否则,它永远不会走 slug 路由
2 you slug 不能为空,如果为空,url 将是 http://localhost/ 它必须走默认路线

routes.MapRoute(
name: "slug",
url: "{slug}",
defaults: new { controller = "Home", action = "show" },
constraints: new{ slug=".+"});

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

我认为不要选择 "Content" 作为动作名称,因为基础 class

中有一个内容方法