我在global.asax中有这些路由
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/{Name}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional },
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
routes.MapRoute(
name: "Post",
url: "{controller}/{action}/{id}/{Title}",
defaults: new {controller = "Post", action = "Index", id = UrlParameter.Optional, Title = UrlParameter.Optional},
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
routes.MapRoute(
name: "GetPostByCategoryName",
url: "{controller}/{action}/{CategoryName}",
defaults:
new {controller = "Post", action = "Index", id = UrlParameter.Optional, CategoryName = UrlParameter.Optional},
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
我有一个与此href http://mysite.com/Post/GetPostsByTagId/3/a的链接 如果我点击该行并重定向到具有相同地址的相同链接的页面 所以我的链接有这个地址 http://mysite.com/Post/GetPostsByTagId/3/a/2/asdasd 并引发错误 这是我的链接语法
<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a>
答案 0 :(得分:0)
这个答案可能无法完全回答你的问题,但它可以帮助你。
<强> URL.Action()强>
首先是一件小事。您链接的URL使用后退,而应使用斜杠。所以改变
<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a>
到
<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)/@category.Id/@category.Name.ToSeoUrl()">@category.Name</a>
为了帮助您,请同时显示当前的结果。
同样在这部分中,您将需要使用route values for the additional url parameters,以便MVC路由系统可以找出在SEO优化的URL中放置内容的位置。那么它看起来像这样:
<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name, new { id = category.Id, CategoryName = category.Name.ToSeoUrl() })">@category.Name</a>
MVC路由
关于您的问题的主要部分与路由有关。设置当前路由的方式是第一个将捕获所有内容,因为该路由中的所有参数都是可选的。
当您使用Url.Action()
或与路由匹配请求时,将使用匹配的第一种可能性。它将不尝试找到最佳匹配。
因此,我们的想法是,您必须将最具体的路线放在首位。如果它们匹配,它们会被使用,如果没有,它会继续,直到最终结束,通常是一个全能路线,就像MVC自动为你输入的路线。
您的第二条和第三条路线的参数仍然是可选的。难道你不是真的意味着对于那些路线,应该要求参数吗?
第二个似乎比第三个更具体,因为它有4个参数,而另一个参数为3。第一个似乎被认为是全能的路线。
作为最后一部分,如果您指定一个默认值,那么仍然可以替换其他任何内容。因此,如果您希望它仅与PostController
匹配,则必须将其放在url
中,而不是defaults
。
这将导致以下更改的路由规则:
routes.MapRoute(
name: "Post",
url: "Post/Index/{id}/{Title}",
defaults: new { controller = "Post", action = "Index" },
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
routes.MapRoute(
name: "GetPostByCategoryName",
url: "Post/GetPostByCategoryName/{CategoryName}",
defaults: new { controller = "Post", action = "GetPostByCategoryName" },
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/{Name}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional },
namespaces: new[] {"MVCTemplateProject.Controllers"}
);
你可以看到url
正在修复PostController
,但路线并没有神奇地知道控制器和动作是什么,所以你仍然需要指定那些你的defaults
。
<强>结论强>
尝试并了解MVC路由系统。这个解释应该对你的方式有所帮助。或者它甚至可以帮助您解决问题。
不完全清楚(如果是这样)你需要什么。如果你详细说明你的问题,我可以详细说明我的答案。