MVC 5路由问题-多条路由错误地瞄准同一个视图

本文关键字:路由 同一个 视图 错误 问题 MVC | 更新日期: 2023-09-27 18:04:07

我配置了多条路由,但由于某种原因,尽管规则针对不同的控制器和不同的视图,但不同的链接路由到同一个视图。请参阅下面,我已经包含了我的routecconfig文件和示例链接如下:

RouteConfig.cs

using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Account",
                url: "Account/{action}/{id}",
                defaults: new { controller = "Account", id = UrlParameter.Optional }
            );
            routes.MapRoute(
                name: "Member",
                url: "Member/{action}/{id}",
                defaults: new { controller = "Member", id = UrlParameter.Optional }
            );
            routes.MapRoute(
                name: "Root",
                url: "{action}/{id}",
                defaults: new { controller = "Home", id = UrlParameter.Optional }
            );
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
            routes.MapRoute(
                    name: "Details",
                    url: "{controller}/{action}/{u}",
                    defaults: new
                    {
                        controller = "Member",
                        action = "Details",
                        u = UrlParameter.Optional
                    }
            );
            routes.MapRoute(
                name: "Article",
                url: "{Home}/{Article}/{id}/{articleName}",
                defaults: new { controller = "Home", action = "Article" }
            );
            routes.MapRoute(
                name: "Item",
                url: "{News}/{Item}/{id}/{itemName}",
                defaults: new { controller = "News", action = "Item" }
            );
        }
    }
}

http://localhost:11508/Home/Article/2/Participate
http://localhost:11508/News/Item/2/Second-Test

可以看到,链接和规则肯定是唯一的,但是由于某种原因Item规则被忽略了,它只是将Id 2传递给Home/Article视图。

MVC 5路由问题-多条路由错误地瞄准同一个视图

您不应该在括号中包含控制器/操作名称-只需按原样传递它们,以便路径可以匹配。最后两个路由应该是这样的:

        routes.MapRoute(
            name: "Article",
            url: "Home/Article/{id}/{articleName}",
            defaults: new { controller = "Home", action = "Article" }
        );
        routes.MapRoute(
            name: "Item",
            url: "News/Item/{id}/{itemName}",
            defaults: new { controller = "News", action = "Item" }
        );

同样,最好将此类特定路由放在任何其他路由之前,而不是放在默认路由之后。

基本上这应该是一个单独的问题,但在这里回答更容易。

从评论:

如何将http://localhost:11508/Member/Details?u=testuser路由到http://localhost:11508/Member/Details/testuser而不是显示参数。

  1. 创建接受此参数的控制器动作,如下所示:

    public ActionResult Details(string u, ...)
    {
        var model = new ...
        ...
        return View(model);
    }
    
  2. 注册路由,接受u参数作为URL部分,如下所示

        routes.MapRoute(
            name: "MyRoute",
            url: "Member/Details/{u}",
            defaults: new { controller = "Member", action = "Details", u = UrlParameter.Optional }
        );
    

    这里{u}实际上声明了参数名称,以及它应该如何在URL中使用(解析/渲染)。

  3. 像这样呈现URL链接:

    <a href="@Url.Action("Details", "Member", new {u = "testuser"})">linktext</a>
    

在所有这些步骤中,u是您将使用的参数名称。

Mapping采用第一个匹配规则。"Item"-Route永远不会被使用,因为Article-Root会捕获所有与"Item"-Route匹配的请求。检查路由的顺序,并删除{}周围的新闻

routes.MapRoute(
            name: "Item",
            url: "News/Item/{id}/{itemName}",
            defaults: new { controller = "News", action = "Item" }
        );

您的问题在于您注册路由的顺序。规则是,您应该从最具体到最不具体地注册它们。换句话说,你的"默认"路由应该是最后一个。

你现在如何拥有它,MVC得到你的默认路由命中,因为你的item路由匹配,所以一旦它命中,它停止寻找其他路由并使用它。

移动你的item路由到你的RegisterRoutes方法的顶部,它应该工作良好