【问题标题】:Nested areas in MVC 2 / MVC 3 / MVC 4MVC 2 / MVC 3 / MVC 4 中的嵌套区域
【发布时间】:2011-03-13 19:18:09
【问题描述】:

从 MVC 2 开始,我们可以轻松创建区域。现在我的问题与嵌套区域(区域内的区域)有关。

选择我的“father”区域文件夹,鼠标右键单击 > Add > 没有new Area 选项。

是否有可能以其他方式做到这一点?或者这个选项会在不久的将来提供吗?

【问题讨论】:

  • 我读了两遍,想到了公司内部网的组织结构..

标签: asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4


【解决方案1】:

我知道这是一个老问题,但我会回答,以防其他人试图弄清楚。对此的解决方案是在比区域更低的级别创建使用不同路由值的区域,例如,您的 RouteConfig 看起来像这样:

public class RouteConfig
    {
        /// <summary>
        /// A function that registers the default navigation route.
        /// </summary>
        /// <param name="routes">The RouteCollection to act on.</param>
    public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            var route = routes.MapRoute(
            name: "Default",
            url: "{area}/{subArea}/{controller}/{action}/{id}",
            defaults: new { area = "DefaultArea", controller = "Home", action = "Splash", id = UrlParameter.Optional, section = "Customer" },
            namespaces: new string[] { "Application.Controllers" });
        }
    }

您的一个子区域注册可能如下所示:

public class ApplicationSubAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "ApplicationSubArea";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "SubArea_default",
            "Area/SubArea/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new string[] { "Application.Areas.AreaName.SubAreaName.Controllers" }
        );
    }
}

读完之后,“区域”看起来还是一个词吗?因为它不适合我。

附:您可以根据需要(理论上)多次递归地执行此操作,例如您可以这样做

url: "{area}/{subArea}/{subSubArea}/{subSubSubArea}/{evenMoreSubArea}/{controller}/{action}/{id}",

在您的 RouteConfig.cs 和

"Area/SubArea/SubSubArea/SubSubSubArea/EvenMoreSubArea/{controller}/{action}/{id}",

在您所在的地区注册。

【讨论】:

  • 您甚至可以执行复杂的路由,例如“{area}/{subArea}/{controller}/{action}/{id}”,然后是“{area}/ExplicitSubArea/{controller}/{ action}/{id}" 这样任何带有 subArea = "ExplicitSubArea" 的东西都会路由到指定的控制器集,而不管它在哪个区域,尽管这会变得混乱,并且在大多数情况下可能不是你应该 做。
  • 感谢您重新提出这个问题并提供如此好的解决方案。我还没有尝试过,但我会给这个答案正确的选择。再次感谢:)
【解决方案2】:

目前没有任何信息表明是否会有嵌套区域。

未来可能会改变。

【讨论】:

    【解决方案3】:

    使用Multi-project areas 的想法作为开始,我猜你可以递归地创建更多的嵌套区域。

    【讨论】:

      【解决方案4】:

      也许这样的事情会有所帮助。它更像是 mvc-contrib 中的一项研究。 我看到它的版本 1 不知道它是否与 MVC2 兼容 就是子控制器的概念:http://mhinze.com/subcontrollers-in-aspnet-mvc/

      【讨论】:

        【解决方案5】:

        此时MVC 仅支持主应用程序,然后支持下一级的区域而不是嵌套区域,但您可以查看This Nuget Package,它为您的项目添加了以下功能:

        • 使用命名空间(没有更多区域)组织您的控制器和视图,这些命名空间可以随心所欲。
        • 可以基于每个参数或每个站点覆盖的原始类型的默认约束。
        • 对相似路线进行智能分组以实现高效匹配。
        • 支持根控制器。
        • 支持重载操作。
        • 支持分层(也称为 RESTful)路由。
        • 支持用户定义的自定义路由。
        • 检测不明确的路线。
        • 路由格式(例如小写、连字符分隔、下划线分隔等)。
        • 将您的路线渲染为对 MapRoute 扩展方法的调用,以进行调试。
        • 支持嵌入式视图(作为程序集资源)。

        【讨论】:

        • 谢谢,我去看看。
        【解决方案6】:

        您不希望有嵌套区域。 您的软件设计有问题。

        最常见的情况是,您使用区域作为 Html 渲染器, 因此是显示模板。

        【讨论】:

        • 不,这不是原因,也不是设计问题 :) 嵌套区域的想法是拥有“区域”中的所有优点并将它们扩展到“树类型”组织”以及将概念组织和分离到嵌套区域中。那真的很酷。就像“嵌套母版页”概念的某些部分一样。
        • 母版页只是“视图”部分。这意味着,嵌套它们允许视图具有层次结构。一个区域里面有控制器、模型和视图。但好吧,让我们更深入。您希望如何从嵌套区域派生。在控制器中?在视图中调用另一个控制器?也许有一个设计,我只是想不通......
        • 是的,我完全同意这一点。我们鼓励使用区域。但是让它们嵌套的原因是什么?
        • 多租户可能是嵌套区域的一个用例
        • 嵌套区域并不一定意味着设计有问题。在具有单层区域的大型复杂应用程序中,会导致路由扩散。这就像说“为什么需要磁盘上的子文件夹?当然,单级文件夹就足够了”
        猜你喜欢
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        相关资源
        最近更新 更多