Asp.net mvc MVC区域和HTML Slug
我正在尝试缩短MVC应用程序上的URL(如果可能的话)。我使用我的web应用程序上的区域。目前,我的URL slug正在运行,这个seite帮助了很多: 这是我工作区注册的一部分,注意,{articleTitle}是slugAsp.net mvc MVC区域和HTML Slug,asp.net-mvc,url,asp.net-mvc-areas,asp.net-mvc-5.2,Asp.net Mvc,Url,Asp.net Mvc Areas,Asp.net Mvc 5.2,我正在尝试缩短MVC应用程序上的URL(如果可能的话)。我使用我的web应用程序上的区域。目前,我的URL slug正在运行,这个seite帮助了很多: 这是我工作区注册的一部分,注意,{articleTitle}是slug public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Discus
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 = "" }
);
}
这将生成一个长URL(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个错误。这可能吗?按照路由设置的方式,除非生成URL,否则将永远不会点击
查看文章
路由,因为URL/Discussion/Articlev1/Details/id/cool html文章
将匹配讨论
默认路由
首先,将它们按正确的顺序排列():
从那里,只要您注意确保整个配置中没有URL冲突,就可以轻松地将第一个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 }
);
}
注意:如果一篇文章的视图
URL没有id
,可能也没有意义,因此您不应该使用id=UrlParameter。在这种情况下是可选的
当然,这意味着如果您的应用程序中有一个名为ArticleV1Controller
的控制器,则View\u Article
路由将匹配(并将id
参数设置为您在URL中传递的操作)。如果您无法接受将/Details
段硬编码到URL中,那么您需要以另一种方式对其进行区分,例如使用路由约束。以下假设您的ID必须为所有数字:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
name: "View_Article",
url: "Discussion/Articlev1/{id}/{articleTitle}",
defaults: new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional },
constraints: new { id = @"\d+" }
);
context.MapRoute(
name: "Discussion_default",
url: "Discussion/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional }
);
}
谢谢夜猫子,我现在就去试试。我应该用什么来代替URL.optional?URL。是否需要?-哦,忽略这个问题,我看到第二个问题解决了这个问题现在我有一个问题,我的创建和编辑方法不起作用,我猜是因为那些操作/控制器URL匹配操作/id格式?有没有好办法解决这个问题?如果我在RouteConfig中创建了一个“ignoreroutes”,而忽略了sitename.com/Articlev1/*,会不会造成太多问题?我现在就玩这个…再次感谢你。最后,我在RouteConfig上使用了一个ignoreroute,但如果这被证明太麻烦,那么我将使用约束。我甚至不知道约束。IgnoreRoutes是阻止路由匹配。例如,默认情况下,/
、/Home
和/Home/Index
都可以工作,但是如果设置忽略路由(“Home/Index”)
,它将返回404 not found而不是主页<代码>忽略路由
对路由是否冲突没有影响。
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 }
);
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
name: "View_Article",
url: "Discussion/Articlev1/{id}/{articleTitle}",
defaults: new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional },
constraints: new { id = @"\d+" }
);
context.MapRoute(
name: "Discussion_default",
url: "Discussion/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional }
);
}