【问题标题】:Routing is finding the controller in my areas, but not the views路由在我的区域中找到控制器,但不是视图
【发布时间】:2011-03-29 15:51:06
【问题描述】:

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

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 }
        ));
    }
}

我很困惑为什么它可以在区域内找到控制器,但不是视图。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing


    【解决方案1】:

    好的,我想通了。下载 MVC 2 源代码并将其添加到我的解决方案中,如here 所述,我逐步完成了 MVC 代码。我发现区域内的路由实现了 IRouteWithArea 接口。该接口向 RouteData 添加了一个“区域”属性,毫不奇怪,该属性包含区域的名称。我修改了 DomainRoute 类来实现这个接口,并添加了几个接受这个附加参数的重载构造函数,它现在完全按照我的意愿工作。

    注册我的路线的代码现在如下所示:

     context.Routes.Add(
         "Admin_Default"
         , new DomainRoute(
             "admin.mydomain"
             ,"Admin"
             , "{controller}/{action}/{id}"
             , new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
            ));
    

    【讨论】:

    • +1 这让我困惑了一段时间。一旦我发现该区域中正确的控制器被击中,但它呈现了错误的视图,我很快发现你的问题和答案 - 效果很好。
    【解决方案2】:

    如果您在区域和默认路由之间共享控制器名称,并且看起来确实如此,那么您可能需要在调用 MapRoute 时识别命名空间。

    例如,如果您的 Web 应用程序的顶级命名空间是 Web,则 Global.asax.cs 文件中的 RegisterRoutes 方法将如下所示:

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",        
        new { action = "Index", id = UrlParameter.Optional },
        null,
        new string[] { "Web.Controllers" }
    );
    

    然后AdminAreaRegistration.csRegisterArea 方法看起来像这样:

    context.MapRoute(
        "Admin_Default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        null,
        new string[] { "Web.Areas.Admin.Controllers" }
    );
    

    【讨论】:

    • 添加多个路由怎么样?如果您需要除 Admin_Default 以外的路由怎么办?例如,如果您想要在您的管理区域中为其他控制器和操作添加路由怎么办?我还没有看到任何人展示这方面的例子......只展示了如何处理区域的默认路线指向的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多