如果我在特定的图层中,我正在尝试添加一个css类。
所以有2个问题:
是否可以在Razor视图中识别当前图层。类似的东西:
if(currentLayer ==“TheHomepage”){...}
在图层上以条件方式处理HTML的正确方法,还是在Orchard中有更好的方法?
答案 0 :(得分:2)
如果您需要查看当前处于活动状态的图层,可以执行以下操作:
@using Orchard.Widgets.Services
@{
var widgetsService = WorkContext.Resolve<IWidgetsService>();
var ruleManager = WorkContext.Resolve<IRuleManager>();
var activeLayerNames = new List<string>();
foreach (var layer in widgetsService.GetLayers()) {
try {
if (ruleManager.Matches(layer.LayerRule)) {
activeLayers.Add(layer.Name);
}
} catch(Exception ex) {
// Problem occurred during layer rule evaluation.
// Just treat it as though the layer rule did not match.
}
}
if (activeLayerNames.Contains("TheHomePage")) {
/* ... Your code here ... */
}
}
上面的大部分代码在驱动程序或控制器中更有意义,但如果您只在视图层中工作,则可以这样做。
答案 1 :(得分:0)
您可以创建包含所需@{Style.Include}
语句的窗口小部件,然后将其添加到图层中。
按照此说明使用剃刀代码创建新的Widget:Creating simple custom Orchard widgets,将新窗口小部件命名为CssIncluder
然后将此视图添加到主题中,如果您愿意,可以使用“形状”跟踪工具:
的widget-CssIncluder.cshtml :
@{
Model.Metadata.Wrappers.Clear();
Style.Include("somestyle.css");
}
最后将小部件添加到您选择的图层。请务必取消选中标题呈现选项以获取干净的代码。
答案 2 :(得分:0)
根据Katsuyuki的回答,我为WorkContext创建了一个扩展方法,将所有活动层转换为css类。
using Orchard;
using Orchard.Widgets.Services;
using System.Collections.Generic;
namespace KidsMinistryTeam.Theme.Extensions
{
static public class WorkContextExtensions
{
static public IList<string> GetLayerCssClasses(this WorkContext workContext)
{
var widgetsService = workContext.Resolve<IWidgetsService>();
var ruleManager = workContext.Resolve<IRuleManager>();
var classNames = new List<string>();
foreach (var layer in widgetsService.GetLayers())
{
try
{
if (ruleManager.Matches(layer.LayerRule))
{
classNames.Add(string.Format("{0}-layer", layer.Name.ToLower())); //add any additional class sanitizing logic here
}
}
catch
{
}
}
return classNames;
}
}
}
然后通过在我的主题的Layout.cshtml中将它添加到Model.Classes,我现在能够根据活动图层进行样式设计。
foreach(string className in WorkContext.GetLayerCssClasses())
{
Model.Classes.Add(className);
}