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