-1

我在 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>
4

1 回答 1

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>

为了让我们帮助您,请同时显示当前结果。

同样在这一部分中,您将希望为附加的 url 参数使用路由值,以便 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"}
);

你可以看到,urls 是为 固定的PostController,但是路由并不神奇地知道控制器和动作是什么,所以你仍然需要在你的defaults.

结论

尝试更多地了解 MVC 路由系统。这个解释应该对你有所帮助。或者它甚至可以帮助您解决问题。

您需要什么并不完全清楚(如果这是)。如果您详细说明您的问题,我可能会详细说明我的答案。

于 2013-01-09T13:20:20.220 回答