在mvc和链接中路由

时间:2013-01-06 10:14:47

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

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

1 个答案:

答案 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路由系统。这个解释应该对你的方式有所帮助。或者它甚至可以帮助您解决问题。

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