我正在尝试缩短我的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错误。这可能吗?
答案 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