如何在 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 中执行 301 永久重定向路由
如何在 asp.net mvc 3 项目中路由 .aspx 页面?
如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')?