MVC Areaname / AreaRegistration:是否可以使用子文件夹的斜杠?

时间:2013-10-19 05:04:14

标签: asp.net-mvc asp.net-mvc-5

我正在尝试在我的新MVC项目中获得比Area更深的层。这将是一个相当大的项目,组织对我来说至关重要。理想情况下,我想使用子目录/子文件夹更嵌套的方法,所以像这样:

/社交/事件/管理/编辑/ 1

如果我做这样的事情

public override string AreaName 
    {
        get 
        {
            return "social/events";
        }
    }

一切都像一个冠军一样工作。 Resharper或VS2013本身并不喜欢这样,并显示一个红色的Return View();但是所有内容都会编译并且路由按预期工作。

有什么“烘焙”会让这个想法变得糟糕吗?从我所看到的,整个区域约定比区域路由的AreaRegistration.Name映射更多。但是因为我们正在使用文字字符串,所以我们知道这有时会如何运作。

我正在使用MVC5,虽然这在技术上适用于此实现,但我想确保我没有违反惯例,或者是否有更好的方法来组织这个更深层次而不仅仅是区域/名称/控制器。会有很多观点,这是一个网站的怪物。

1 个答案:

答案 0 :(得分:0)

区域有两个目的:

在您进行路径查找时,它会对逻辑组中的路由进行分组,例如GetVirtualPathForArea方法。

它确定属于某个区域的视图的虚拟路径的一部分,从而也对视图进行分组。占位符{2}位于以下路径中:

AreaViewLocationFormats = new[]
{
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaMasterLocationFormats = new[]
{
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaPartialViewLocationFormats = new[]
{
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};

因此,只要您的AreaName可以作为密钥(所以任何字符串)和目录路径的一部分,您就可以了。