Glimpse不适用于Area

时间:2014-04-29 07:35:17

标签: asp.net-mvc razor glimpse

我是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?

我把它放回去让事情有效,这背后的实际原因是什么?这应该一直存在还是一瞥?

1 个答案:

答案 0 :(得分:2)

您所描述的实际上是正常行为,并且与路线注册的顺序有关。

让我解释一下,根据您创建的绿色田野项目来确定问题。

当您创建新的MVC项目并添加Test区域时,您将在项目中找到以下类型和方法:

  1. 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 }
        );
      }
    } 
    
  2. Application_Start内的global.asax方法定义为:

    protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    
  3. 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 }
        );
      }
    }
    
  4. 现在只需阅读有关注册应用程序路由的启动代码:

    1. 首先,区域正在注册AreaRegistration.RegisterAllAreas();

    2. 该调用将导致TestAreaRegistration.RegisterArea(...)被调用,这将注册路由Test/{controller}/{action}/{id}

    3. 然后将调用RouteConfig.RegisterRoutes(RouteTable.Routes)来注册默认的{controller}/{action}/{id}路由,并注册一条路由来忽略.axd个请求。

    4. 现在重要的是要记住,首先检查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

      现在您可以通过两种方式解决这个问题:

      1. Test添加到context.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");方法的顶部,路线将被忽略,就像它在默认情况中一样

      2. 使用TestAreaRegistration.RegisterArea切换AreaRegistration.RegisterAllAreas();,以便首先匹配RouteConfig.RegisterRoutes(RouteTable.Routes)路由

      3. 我个人会选择1,因为影响最小。