Orchardcms Orchard CMS:基于层的条件CSS类

Orchardcms Orchard CMS:基于层的条件CSS类,orchardcms,Orchardcms,如果我在一个特定的层中,我会尝试添加一个css类 因此,有两个问题: 是否可以在Razor视图中识别当前图层。比如: 如果(currentLayer==“TheHomepage”){…} 在图层上处理HTML的正确方法是有条件的,还是在Orchard中有更好的方法 如果需要查看哪些图层当前处于活动状态,可以执行以下操作: @using Orchard.Widgets.Services @{ var widgetsService = WorkContext.Resolve<IWidg

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

因此,有两个问题:

  • 是否可以在Razor视图中识别当前图层。比如:

    如果(currentLayer==“TheHomepage”){…}

  • 在图层上处理HTML的正确方法是有条件的,还是在Orchard中有更好的方法


  • 如果需要查看哪些图层当前处于活动状态,可以执行以下操作:

    @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 ... */
        }
    }
    
    @使用Orchard.Widgets.Services
    @{
    var widgetsService=WorkContext.Resolve();
    var ruleManager=WorkContext.Resolve();
    var activeLayerNames=新列表();
    foreach(widgetsService.GetLayers()中的var层){
    试一试{
    if(ruleManager.Matches(layer.LayerRule)){
    添加(layer.Name);
    }
    }捕获(例外情况除外){
    //层规则评估期间出现问题。
    //只需将其视为图层规则不匹配。
    }
    }
    if(activeLayerNames.Contains(“主页”)){
    /*…你的代码在这里*/
    }
    }
    

    上面的大部分代码在驱动程序或控制器中更有意义,但如果您仅在视图层中工作,则可以这样做。

    您可以创建一个小部件,其中包含所需的
    @{Style.Include}
    语句,然后将其添加到层中

    按照以下说明使用razor代码创建新的小部件:,将新小部件命名为CssIncluder

    然后将此视图添加到主题中,如果愿意,可以使用形状跟踪工具:

    Widget-CssIncluder.cshtml:


    最后,将小部件添加到您选择的层中。确保取消选中标题呈现选项以获得清晰的代码。

    基于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;
            }
        }
    }
    

    答案是正确的,但您似乎对层和小部件有一些误解。对于任何给定的请求,可以有任意数量的活动层,而不仅仅是一个,因此“当前层”实际上并不存在,除了小部件的视图代码内,因为每个小部件只属于一个层。层本质上是条件:它们就像小部件周围的一个大if结构,所以如果你想根据一个层是否处于活动状态来做一些事情,只需创建一个做这些事情的小部件,并将其粘贴到该层中(这几乎是Marco的答案)
    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;
            }
        }
    }
    
    foreach(string className in WorkContext.GetLayerCssClasses())
    {
        Model.Classes.Add(className);
    }