MVC领域和HTML Slug

时间:2018-01-17 15:47:06

标签: asp.net-mvc url asp.net-mvc-areas asp.net-mvc-5.2

我正在尝试缩短我的MVC应用程序上的URL(如果可能的话)。我在我的网络应用上使用区域。目前我的URL slugs正在运行,这个帮助很多:http://www.itorian.com/2016/12/slug-url-in-mvc.html

以下是我的工作区域注册的一部分,请注意{articleTitle}是slug。

public override void RegisterArea(AreaRegistrationContext context)
        {       
            context.MapRoute(
                "Discussion_default",
                "Discussion/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );

            context.MapRoute(
                "View_Article",
                "Discussion/Articlev1/Details/{id}/{articleTitle}",
                new { controller = "Articlev1", action = "Details", id = UrlParameter.Optional, articleTitle = "" }
            );
        }

这会生成一个很长的网址(www.sitename.com/Discussion/Articlev1/Details/id/cool-html-article)

有没有办法让它生成并使用类似的东西:

www.sitename.com/Articlev1/id/cool-html-article

或者甚至只是忽略了这样的细节部分:

www.sitename.com/Discussion/Articlev1/id/cool-html-article

我尝试了一些但没有一个能够工作,产生404错误或400.1错误。这可能吗?

1 个答案:

答案 0 :(得分:2)

路由设置的方式,除非您生成网址,否则永远不会点击View_Article路由,因为网址/Discussion/Articlev1/Details/id/cool-html-article将与Discussion_default路由匹配。

首先,按照正确的顺序(from most specific to least specific):

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "View_Article",
        "Discussion/Articlev1/Details/{id}/{articleTitle}",
        new { controller = "Articlev1", action = "Details", id = UrlParameter.Optional, articleTitle = UrlParameter.Optional }
    );

    context.MapRoute(
        "Discussion_default",
        "Discussion/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

从那里可以很容易地将第一个URL更改为您喜欢的任何内容,只要您注意确保整个配置中没有URL冲突。

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "View_Article",
        "Discussion/Articlev1/{id}/{articleTitle}",
        new { controller = "Articlev1", action = "Details", id = UrlParameter.Optional, articleTitle = UrlParameter.Optional }
    );

    context.MapRoute(
        "Discussion_default",
        "Discussion/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}
  

注意:如果View_Article网址没有id,也可能没有意义,所以你不应该{{1}在那种情况下。

id = UrlParameter.Optional

当然,这意味着如果您的应用程序中有一个名为public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "View_Article", "Discussion/Articlev1/{id}/{articleTitle}", new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional } ); context.MapRoute( "Discussion_default", "Discussion/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } 的控制器,ArticleV1Controller路由将匹配(并将View_Article参数设置为您在URL)。如果您不能将id段硬编码到URL中,那么您需要以另一种方式区分它,例如使用路由约束。以下假设您的ID必须是所有数字:

/Details