我是Asp.Net MVC的新手,由于我一直在使用Routes的一些问题,我发现了Glimpse并认为我会试一试,但我无法获得Glimpse.axd配置页面,经常获得HTTP 404。
我做了一个新项目并尝试过,它工作得很好。通过反复试验,我最终发现问题出现在我的区域的AreaRegistration文件中,如果我这样做:
context.MapRoute(
"SomeArea_default",
"Area/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
它有效,我可以到达页面,但如果我遗漏区域部分
context.MapRoute(
"SomeArea_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
然后它没有。
我之前曾询问该部分是否是可选的,我认为是: Area routing, why is the area name needed?
我把它放回去让事情有效,这背后的实际原因是什么?这应该一直存在还是一瞥?
答案 0 :(得分:2)
您所描述的实际上是正常行为,并且与路线注册的顺序有关。
让我解释一下,根据您创建的绿色田野项目来确定问题。
当您创建新的MVC项目并添加Test
区域时,您将在项目中找到以下类型和方法:
TestAreaRegistration
类定义为:
public class TestAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Test"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Application_Start
内的global.asax
方法定义为:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
RouteConfig
文件夹中的App_Start
类定义为:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
现在只需阅读有关注册应用程序路由的启动代码:
首先,区域正在注册AreaRegistration.RegisterAllAreas();
该调用将导致TestAreaRegistration.RegisterArea(...)
被调用,这将注册路由Test/{controller}/{action}/{id}
然后将调用RouteConfig.RegisterRoutes(RouteTable.Routes)
来注册默认的{controller}/{action}/{id}
路由,并注册一条路由来忽略.axd
个请求。
现在重要的是要记住,首先检查Test
区域定义的所有路由,然后检查RouteConfig
定义的路由,以防它不是Test
1}}区域相关路线
现在,当您使用此默认设置请求/glimpse.axd
时,这意味着什么?
将匹配的路线是RouteConfig
内忽略的路线,因为Test
区域将处理的路线必须以Test/
开头,显然情况并非如此/glimpse.axd
但如果从Test/
区域注册中的Test/{controller}/{action}/{id}
路由注册中删除Test
部分,则匹配{{1}的路由请求现在将由/glimpse.axd
区域定义的路由处理,因为它基本上将充当catch all,并且因为它将找不到匹配,所以返回404。
TL; DR
现在您可以通过两种方式解决这个问题:
将Test
添加到context.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
方法的顶部,路线将被忽略,就像它在默认情况中一样
使用TestAreaRegistration.RegisterArea
切换AreaRegistration.RegisterAllAreas();
,以便首先匹配RouteConfig.RegisterRoutes(RouteTable.Routes)
路由
我个人会选择1,因为影响最小。