4

我一直在编写一个将 MVC 用作生成页面的主要引擎的 cms。

我进展顺利,但希望能够为每个站点创建一个独特的剃须刀模板,如果需要,还可以为每个视图创建一个独特的剃须刀模板。

我的规则是每个项目都必须有一个与 url 链接的唯一代码。

每个项目站点的资产以​​位置与项目相关的方式存储。

因此,与项目 C0001 关联的资产将存储在C0002 中assets\C0001\并用于 C0002:assets\C0002\等等。

为了保持整洁,我想做的是让剃须刀模板也与位于该assets\[ProjectCode]位置的项目相关联,但问题是我收到关于ViewBag not existing in context.

所以这行不通:

Layout = string.Concat("~/assets/",ViewBag.ProjectNumber,"/_Layout.cshtml");

如下将呈现页面:

Layout = string.Concat("~/Views/Shared/_",ViewBag.ProjectNumber,"Layout.cshtml");

我猜第一个布局没有呈现,因为它在已知的视图搜索区域之外?但是当我告诉它文件在哪里时,我看不出问题出在哪里?

我很高兴使用示例 2 中的代码,但可能意味着在相当数量的项目站点之后,共享视图目录将变得非常繁忙。

Views只是想知道视图需要存在于目录中是否有原因?

4

2 回答 2

7

您需要复制位于您的Views目录中的 web.config 并将副本放入您的Assets目录中。由于您需要为布局提供完整路径,这不是搜索路径问题,它需要 web.config 中的信息来正确初始化视图。

于 2011-02-03T20:58:13.273 回答
4

默认情况下,RazorViewEngine配置为在Views目录中查找。

您可以通过使用不同路径创建自己的RazorViewEngine实例并将其添加到ViewEngines.Engines.

它的默认路径是

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

ViewLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};
MasterLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};
PartialViewLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};
于 2011-02-03T17:02:43.073 回答