我在尝试使用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:
2>'/'应用程序中的服务器错误。无法找到资源。 说明: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);
}
如何构建路径以便正确命中所有三种操作方法?
答案 0 :(得分:11)
ASP.NET MVC Routing评估从上到下的路由。因此,如果两条路线匹配,则它击中的第一条路线(靠近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
);
您的设置还存在其他问题,但这些是我们立刻想到的两件事。
答案 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。