MVC 2 / MVC 3 / MVC 4 中的嵌套区域

10
自从MVC 2以来,我们可以轻松创建区域。现在我的问题与嵌套区域(区域内的区域)有关。
选择我的“父”区域文件夹,右键单击 > 添加 > 没有选项用于新区域。是否有其他方法可以实现?或者这个选项将在不久的将来提供?

我读了两遍,认为是公司内部网络的组织结构。 - Ahmad
6个回答

9

我知道这是一个老问题,但我会回答它,以防其他人也在尝试解决它。解决此问题的方法是创建使用比区域更低级别的不同路由值的区域,因此例如您的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" }
        );
    }
}

阅读完这段内容后,“area”还看起来像一个单词吗?对我来说已经不是了。
另外,你可以递归地执行此操作多次(理论上),例如:
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" 的内容都会路由到指定的控制器集合,而不管它所在的区域是什么,尽管这样做会变得混乱,在大多数情况下可能并不是你应该做的事情。 - Ceshion
感谢重新开放这个问题并提供如此好的解决方案。我还没有尝试过,但我会选择这个答案作为正确的选择。再次感谢 :) - Dryadwoods

3

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

将来可能会有所改变。


2

使用多项目区域的概念为起点,我猜您可以递归地创建更多嵌套区域。


0

0

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

  • 使用命名空间(不再使用区域)组织控制器和视图,可深入到任意层级。
  • 默认约束基元类型,可在每个参数或每个站点上进行覆盖。
  • 智能分组类似路由以提高匹配效率。
  • 支持根控制器。
  • 支持重载操作。
  • 支持分层(即 RESTful)路由。
  • 支持用户定义的自定义路由。
  • 检测模糊路由。
  • 格式化路由(例如转换为小写、连字符分隔、下划线分隔等)。
  • 将路由呈现为对 MapRoute 扩展方法的调用,以进行调试。
  • 支持嵌入式视图(作为程序集资源)。

谢谢,我会去看一下。 - Dryadwoods

-2

您不想要嵌套区域。

您的软件设计存在问题。

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


1
主页面只是“视图”部分,即嵌套它们可以让视图具有层次结构。区域内包含控制器、模型和视图。但好吧,让我们深入了解。你想如何在控制器中从嵌套的区域派生出来?在视图中调用其他控制器?也许有一种设计,我只是无法想出来... - cRichter
一个区域允许不同的组织方式,不仅因为它有不同的命名空间,而且因为它有自己的控制器、视图、模型目录结构。我认为这样做有很多优点。 - Dryadwoods
1
是的,我完全同意。我们鼓励使用区域(areas)。但是为什么要将它们嵌套呢? - cRichter
1
多租户可能是嵌套区域的一个使用案例。 - bushed
14
嵌套的区域并不一定意味着设计存在问题。在一个大型和复杂的应用程序中,只有单层级别的区域会导致路由增加。这就像说“为什么你需要磁盘上的子文件夹?一个单层级别的文件夹肯定足够了”。 - Quango
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接