如何修复ASP.NET MVC中的路由404?

时间:2012-01-05 04:09:57

标签: c# asp.net-mvc asp.net-mvc-3 routing

我在尝试使用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.您要查找的资源(或其中一个依赖项)可能已被删除,其名称已更改,或者是   暂时不可用。请查看以下网址并制作   确保它拼写正确。

     

请求的网址:/ 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);
}

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

5 个答案:

答案 0 :(得分:11)

ASP.NET MVC Routing评估从上到下的路由。因此,如果两条路线匹配,则它击中的第一条路线(靠近RegisterRoutes方法的“顶部”的路线)将优先于后续路线。

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

  1. 您的默认路线应位于底部。
  2. 如果路线包含相同数量的路段,则路线需要对它们有约束:
  3. 有什么区别:

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

    您的设置还存在其他问题,但这些是我们立刻想到的两件事。

答案 1 :(得分:2)

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

$array

答案 2 :(得分:0)

将最通用的路由推送到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 }
        );

}

答案 3 :(得分:0)

将默认路由移至末尾,默认路由应该是要定义的最后一条路由,因为它充当了捕获所有路由

答案 4 :(得分:0)

在我的情况下,同一问题的答案是需要"包括在项目"相关的控制器和视图,而不是错误的路由规则。

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

{+ 1 hate}授予Visual Studio错误的超自动化,让我通过Web.Config文件挖掘,试图解决扩展问题,甚至试图(并且失败)掀起一个不错的ErrorController。