Orchard CMS:基于Layer的条件CSS类

时间:2013-12-13 16:54:33

标签: orchardcms

如果我在特定的图层中,我正在尝试添加一个css类。

所以有2个问题:

  1. 是否可以在Razor视图中识别当前图层。类似的东西:

    if(currentLayer ==“TheHomepage”){...}

  2. 在图层上以条件方式处理HTML的正确方法,还是在Orchard中有更好的方法?

3 个答案:

答案 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);
}