Asp.net mvc 3 MVC3 RouteHandler结果忽略已解析路由中的区域-为什么?

Asp.net mvc 3 MVC3 RouteHandler结果忽略已解析路由中的区域-为什么?,asp.net-mvc-3,c#-4.0,asp.net-mvc-areas,asp.net-mvc-3-areas,mvcroutehandler,Asp.net Mvc 3,C# 4.0,Asp.net Mvc Areas,Asp.net Mvc 3 Areas,Mvcroutehandler,我正在将MVC3应用程序分为两个区域。现有的应用程序将进入一个领域(V1),我们将在第二个领域(V2)开始重新设计 我已将视图、模型、控制器等全部移动到MyApp\Areas\V1\xxx文件夹中,并且我已经能够验证在大多数情况下加载的内容是否正常。我将V1的所有路由注册移到V1AreaRegistration.cs文件中,并将其修改为使用context.MapRoute,而不是RouteTable.Routes.MapRoute 通过Phil Haack的RoutedBugger查看路由,一切

我正在将MVC3应用程序分为两个区域。现有的应用程序将进入一个领域(V1),我们将在第二个领域(V2)开始重新设计

我已将视图、模型、控制器等全部移动到MyApp\Areas\V1\xxx文件夹中,并且我已经能够验证在大多数情况下加载的内容是否正常。我将V1的所有路由注册移到V1AreaRegistration.cs文件中,并将其修改为使用
context.MapRoute
,而不是
RouteTable.Routes.MapRoute

通过Phil Haack的RoutedBugger查看路由,一切看起来都很好-我的V2路由正在按其应该的方式解决,基本的V1路由工作正常。不起作用的是V1路由,其中我定义了一个自定义的
MvcRouteHandler
,如下所示:

context.MapRoute(
    "MyRouteName",
    "{myRouteVal}/{controller}/{action}",
    new { area = "V1", controller = "DefaultController", action = "Index" },
    new { controller = _someRouteConstraint},
    new string[] { "My.Custom.Project.WebLibrary.Areas.V1.Controllers" },
        _myCustomRouteHandler);
如果我从这个调用中删除
\u myCustomRouteHandler
,它将非常有效,并将我发送到V1区域下的正确视图。有了它,路由似乎忽略了它被注册为区域路由的事实,我得到了一个黄色的错误页面,上面写着:

The view 'Index' or its master was not found or no view engine
supports the searched locations. The following locations were searched:
~/Views/DefaultController/Index.cshtml
~/Views/DefaultController/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
~/Views/DefaultController/Index.aspx
~/Views/DefaultController/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
我需要能够使用路由处理程序-它对
{myRoutVal}
参数执行一些验证工作,如果无效,则重定向到错误页面


救命

找到了问题。我们为上面提到的
AreaRegistrationContext
提供了一个扩展方法(
context.MapRoute
)-在该方法中,我没有正确设置
route.DataTokens[“Area”]
值,因此当它试图查找视图时,它不会在区域中查找

将以下行添加到my
AreaRegistrationContext
扩展方法解决了问题:

route.DataTokens["Area"] = context.AreaName;