如何在 ASP.NET MVC 中使用路由修复 404?

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中使用路由修复 404?【英文标题】:How to fix a 404 with routes in ASP.NET MVC? 【发布时间】:2012-02-02 23:37:16 【问题描述】:

我在尝试让路由与 ASP.NET MVC 3.0 一起使用时遇到问题。我声明了以下路线:

public static void RegisterRoutes(RouteCollection routes)

    routes.IgnoreRoute("resource.axd/*pathInfo");

    routes.MapRoute(
        "Default",
        "controller/action/id",
    new  controller = "Home", action = "RsvpForm", id = UrlParameter.Optional  
    );

    routes.MapRoute(
        "TestRoute",
        "id",
        new  controller = "Product", action = "Index3", id = UrlParameter.Optional 
    );

    routes.MapRoute(
        "TestRoute2",
        "action",
        new  controller = "Home", action = "Index", id = UrlParameter.Optional 
    );

当我访问时:

http://localhost

该站点运行正常,并且似乎到达了Default 路由。

当我访问时:

http://localhost/1

我得到一个 404:

“/”应用程序中的服务器错误。

找不到资源。 说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或已更改 暂时不可用。请查看以下 URL 并制作 确保拼写正确。

请求的网址:/1

以下是这些路由对应的操作:

public ActionResult Index3(int? id)

    Product myProduct = new Product
    
        ProductID = 1,
        Name = "Product 1 - Index 3",
        Description = "A boat for one person",
        Category = "Watersports",
        Price = 275M
    ;

    Product myProduct2 = new Product
    
        ProductID = 2,
        Name = "Product 2 - Index 3",
        Description = "A boat for one person",
        Category = "Watersports",
        Price = 275M
    ;

    ViewBag.ProcessingTime = DateTime.Now.ToShortTimeString();

    if (id == 1)
        return View("index", myProduct);
    else
        return View("index", myProduct2);

我如何构建我的路线,以便正确命中所有三种操作方法?

【问题讨论】:

【参考方案1】:

将最通用的路由推到 MapRoute 调用链的最后。

试试这个:

public static void RegisterRoutes(RouteCollection routes)

        routes.IgnoreRoute("resource.axd/*pathInfo");


        routes.MapRoute(
                "TestRoute",
                "id",
                new  controller = "Product", action = "Index3", id = UrlParameter.Optional 
        );

        routes.MapRoute(
                "Default", // Route name
                "controller/action/id", // URL with parameters
                new  controller = "Home", action = "RsvpForm", id = UrlParameter.Optional  // Parameter defaults
                //new  controller = "Product", action = "Index2", id = UrlParameter.Optional  // Parameter defaults
        );


        routes.MapRoute(
                "TestRoute2",
                "action",
                new  controller = "Home", action = "Index", id = UrlParameter.Optional 
        );


【讨论】:

【参考方案2】:

ASP.NET MVC 路由从上到下评估路由。因此,如果两条路由匹配,则它命中的第一个(更接近 RegisterRoutes 方法的“顶部”的那个)将优先于下一个。

考虑到这一点,您需要做两件事来解决您的问题:

    您的默认路由应位于底部。 如果您的路线包含相同数量的路段,则需要对其进行限制:

两者有什么区别:

example.com/1

example.com/index

对于解析器,它们包含相同数量的段,并且没有区分符,因此它将命中列表中匹配的第一个路由。

要解决这个问题,您应该确保使用 ProductIds 的路由接受约束:

routes.MapRoute(
    "TestRoute",
    "id",
    new  controller = "Product", action = "Index3", id = UrlParameter.Optional ,
    new  id = @"\d+"  //one or more digits only, no alphabetical characters
);

您的设置还存在其他问题,但这是一开始就想到的两件事。

【讨论】:

乔治是正确的。此外,您的第一条路线匹配 0、1、2 和 3 段。 localhost/1 有一个段,将映射到第一个路由并查找不存在的 1Controller。【参考方案3】:

将您的默认路由移到最后,默认路由应该是最后定义的路由,因为它充当了一条全部路由

【讨论】:

【参考方案4】:

您的路线 MapRoute 默认应该是最后一个。

routes.MapRoute(
        "Default",
        "controller/action/id",
    new  controller = "Home", action = "RsvpForm", id = UrlParameter.Optional  
    );

【讨论】:

【参考方案5】:

在我的例子中,同样问题的答案是需要“包含在项目中”相关的控制器和视图,而不是不正确的路由规则。

创建我的时,由于某种原因它们没有自动包含在内。这个问题是在我关闭并重新打开解决方案后才发现的。

+1 hat 授予 Visual Studio,因为它有缺陷的超自动化让我挖掘 Web.Config 文件,尝试添加扩展,甚至尝试(但失败)打造一个像样的 ErrorController。

【讨论】:

以上是关于如何在 ASP.NET MVC 中使用路由修复 404?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.Net MVC 路由来路由图像?

ASP.NET MVC如何设置路由启动

如何在 ASP.Net MVC 中执行 301 永久重定向路由

如何在 asp.net mvc 3 项目中路由 .aspx 页面?

如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')?

如何使用 ASP.NET MVC 5 中的 JavaScript 在运行时使用路由值增加 actionlink?