我目前正在开发一个网站,该网站需要能够覆盖document.cshtml文件,以便我可以根据用户的当前位置应用特定的CSS类。
我试图使用以下网址替代方案:
然而,似乎所有这些都使用Document.cshtml而不是使用基于URL的文档。我很容易理解这是预期的目的,但是我想知道是否可以实现上述功能。
我相信我可能在这方面取得了一些进展,而不是使用URL替代方案,只需在模型上添加一个字段(对于文档),只需拉出网站的当前“区域”并应用上课。
(在document.cshtml中)
@using Orchard.Mvc.Html;
@using Orchard.UI.Resources;
@{
RegisterLink(new LinkEntry {Type = "image/x-icon", ...});
string title = Convert.ToString(Model.Title);
string siteName = Convert.ToString(WorkContext.CurrentSite.SiteName);
//Pull the Area here
string area = Model.DesignatedAreaField;
}
<!DOCTYPE html>
<html lang="en" class="static @Html.ClassForPage()">
<head>
<meta charset="utf-8" />
<title>@Html.Title(title, siteName)</title>
@Display(Model.Head)
</head>
<body class='@area'>
//Body goes here
@Display(Model.Body)
@Display(Model.Tail)
</body>
</html>
我相信这可能比以前建议的解决方案更容易。但是,我想知道实际放置一个我可以从文档模型中访问的字段的最简单方法是什么。
答案 0 :(得分:7)
Document.cshtml是Layout形状的包装器。包装不支持替代品。有选择地替换document.cshtml模板的唯一方法是从布局形状的元数据上的包装器集合中删除现有的包装器并添加自己的包装器。
但是等等......我想不出有什么理由要你这样做。 document.cshtml中的内容是样板HTML,在整个站点中应该是相同的。您的更新中描述的解决方案是可行的方法。
答案 1 :(得分:1)
您还可以将<body>
标记移动到Layout.cshtml中,然后使用Layout.cshtml的URL替换来设置<body>'s
类属性。
答案 2 :(得分:0)
您可能想看一下这篇文章:http://weblogs.asp.net/bleroy/archive/2010/12/14/switching-the-layout-in-orchard-cms.aspx。它显示了如何动态添加自己的替代项,但同样的方法可以根据地理位置向模型或布局添加属性。
我认为您可以在OnResultExecuting()中定义一些代码,以动态地向Model类添加属性。因为它是动态类型你应该只能设置它,没有什么特别需要。