一个asp.net-mvc应用程序有一个叫做Route Table的东西。路由表将特定的URL 映射到特定的控制器。一个应用程序只有一个Route Table。这个路由表是在global-asax文件中设置的。如果您没有Route Table,应用程序将始终给出 404 错误。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
} // Parameter defaults
);
}
案例-1。考虑一个应用程序中有 Area 的情况。但是,您没有在 URL 中提及区域名称。示例 localhost/ControllerName/ActionName。如果您注意 URL,则没有区域名称。根控制器目录中也没有这样的控制器。该控制器存在于区域中。假设您的应用程序中有以下区域。
现在你输入 url : localhost/Test/Index然后回车。现在的问题是背景发生了什么?
让我们添加一个RoureDebugger的引用。您可以从此位置获取 Dll。然后我在Application_Start Handler下的global-asax文件中添加了一行代码。
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
当我执行应用程序时。这向我显示了以下输出,而不是索引页面响应。
如果您注意上面的屏幕截图,默认路由已启用,它存在于global-asax文件中。这是因为没有约束的默认 Url 将在应用程序中的任何位置定位 Controller。但是该视图既不存在于根文件夹视图的目录中,也不存在于共享文件夹视图的目录中。最后你会得到 404 错误。
我怎样才能摆脱这个问题?
我过去遇到过类似的问题并找到了纠正措施。下面是global-asax文件中默认路由的新版本。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var route = routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}, // Parameter defaults
new[] { "MvcApplication1.Controllers" }
);
route.DataTokens["UseNamespaceFallback"] = false;
}
在上面的代码中,我在约束和route.DataTokens["UseNamespaceFallback"] = false;
路由中添加了命名空间。执行此操作并使用上述 URL 后,控制器操作方法将永远不会执行,因为控制器中不存在区域名称。
当 Url 不包含区域名称且默认路由不包含 NameSpace 信息时,我还发现了有关 DataTokens 的另一个重要信息。下面是截图。
当 Url 不包含 Area Name 且 Default Route 不包含 NameSpace 信息时,Data Token 信息将不可用。
现在,在按照修改后的默认路由添加 NameSpace 并在 Url 中添加区域名称之后。我们将在屏幕截图中获得如下所示的 DataToken 信息。
下面是RouteData
在 URL 中添加区域名称后的输出
如您所见,区域路线现已启用。
希望这会帮助你。谢谢