【问题标题】:Routing in mvc and linkmvc和link中的路由
【发布时间】:2013-01-06 10:14:47
【问题描述】:

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

【问题讨论】:

  • 这个路径在哪里配置?
  • 您是否尝试过添加另一个知道如何处理第二个(更长)url 的路由?

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

此答案可能无法完全回答您的问题,但应该对您有所帮助。

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"}
);

您可以看到,urls 正在为PostController 修复,但路由并不神奇地知道控制器和操作将是什么,因此您仍然需要在您的 defaults 中指定它们.

结论

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多