我正在努力将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}
参数进行一些验证工作,如果它无效,则重定向到错误页面。
帮助!!
答案 0 :(得分:1)
发现问题。我们有一个AreaRegistrationContext
的扩展方法,您在上面引用了这个方法(context.MapRoute
) - 在该方法中,我没有正确设置route.DataTokens["Area"]
值,因此当它尝试查找视图时,它没有在该地区看。
将以下行添加到我的AreaRegistrationContext
扩展方法中解决了问题:
route.DataTokens["Area"] = context.AreaName;