我正在尝试使用Maarten Balliauw的Domain Route类将子域映射到MVC2应用中的区域,以便我有以下网址:
http://admin.mydomain.com/home/index
而不是:
http://mydomain.com/admin/home/index
到目前为止,我只取得了部分成功。执行被路由到正确区域中的正确控制器,但它无法找到正确的视图。我收到以下错误:
The view 'Index' or its master was not found. The following locations were searched:
~/Views/AdminHome/Index.aspx
~/Views/AdminHome/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
这向我表明MVC只在根视图文件夹中查找视图,而不是在区域内查看视图文件夹。如果我将区域视图文件夹中的视图复制到根视图文件夹,页面呈现正常。然而,这完全违背了将APP划分为区域的目的。
我正在为该地区定义路线:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Admin"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(
"Admin_Default"
, new DomainRoute(
"admin.localhost"
, "{controller}/{action}/{id}"
, new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
));
}
}
我很困惑为什么它找到区域内的控制器很好,但不是视图。
答案 0 :(得分:4)
好的,我明白了。下载MVC 2源代码并按照概述here将其添加到我的解决方案后,我逐步完成了MVC代码。我发现区域内的路由实现了IRouteWithArea接口。此接口向RouteData添加“Area”属性,毫不奇怪,它包含区域的名称。我修改了DomainRoute类,以便实现这个接口,并添加了一些带有这个附加参数的重载构造函数,它现在完全按照我的意愿工作。
现在注册我的路线的代码如下:
context.Routes.Add(
"Admin_Default"
, new DomainRoute(
"admin.mydomain"
,"Admin"
, "{controller}/{action}/{id}"
, new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
));
答案 1 :(得分:1)
如果您的区域和默认路由之间有共享控制器名称,并且看起来像这样,则可能需要在调用MapRoute
时识别名称空间。
例如,如果您的网络应用程序的顶级命名空间为Web
,则RegisterRoutes
文件中的Global.asax.cs
方法将如下所示:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
null,
new string[] { "Web.Controllers" }
);
然后RegisterArea
的{{1}} moethod看起来像这样:
AdminAreaRegistration.cs