路由是在我的区域中找到控制器,而不是视图

Ham*_*359 5 asp.net-mvc asp.net-mvc-routing asp.net-mvc-2

我正在尝试使用Maarten Balliauw的Domain Route类将子域映射到MVC2应用程序中的区域,以便我有以下URL:

http://admin.mydomain.com/home/index
Run Code Online (Sandbox Code Playgroud)

代替:

http://mydomain.com/admin/home/index
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只取得了部分成功.执行被路由到正确区域中的正确控制器,但它无法找到正确的视图.我收到以下错误:

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 
Run Code Online (Sandbox Code Playgroud)

这向我表明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 }
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么它找到区域内的控制器很好,但不是视图.

Ham*_*359 4

好吧,我明白了。下载 MVC 2 源代码并将其添加到我的解决方案(如此处所述)后我单步执行了 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 }
        ));
Run Code Online (Sandbox Code Playgroud)