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

时间:2011-06-23 17:13:51

标签: 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的所有Route注册移动到V1AreaRegistration.cs文件中,并将其修改为使用context.MapRoute而不是RouteTable.Routes.MapRoute

看看与Phil Haack的RouteDebugger的路由,一切看起来都很好 - 我的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);

如果我从此次通话中移除_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}参数进行一些验证工作,如果它无效,则重定向到错误页面。

帮助!!

1 个答案:

答案 0 :(得分:1)

发现问题。我们有一个AreaRegistrationContext的扩展方法,您在上面引用了这个方法(context.MapRoute) - 在该方法中,我没有正确设置route.DataTokens["Area"]值,因此当它尝试查找视图时,它没有在该地区看。

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

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