Javascript Sitecore-项为NULL时的呈现代码
在Sitecore中,您可以使用Javascript Sitecore-项为NULL时的呈现代码,javascript,controller,sitecore,rendering,nothing,Javascript,Controller,Sitecore,Rendering,Nothing,在Sitecore中,您可以使用 @RenderingContext.Current.Rendering.Item["itemname"] 但是:当我将控制器渲染放置到占位符时,尚未指定任何内容。因此不会呈现任何内容,因此我无法检查null 我的具体问题: 我想将数据库项的值添加到调用的参数中 var options = {{lat: @RenderingContext.Current.Rendering.Item["lat"], lng: @RenderingContext.Curr
@RenderingContext.Current.Rendering.Item["itemname"]
但是:当我将控制器渲染放置到占位符时,尚未指定任何内容。因此不会呈现任何内容,因此我无法检查null
我的具体问题:我想将数据库项的值添加到调用的参数中
var options = {{lat: @RenderingContext.Current.Rendering.Item["lat"],
lng: @RenderingContext.Current.Rendering.Item["lng"]},
zoom: @RenderingContext.Current.Rendering.Item["zoom"]};
由于没有任何内容(尚未),部分视图无法加载,因为没有相关内容(尚未)==>javascript错误。如果有内容,就可以了
那我怎么办
- 将默认关联内容项添加到控制器呈现(mhhhh)
- 检查一下吗?什么都没有?是空的吗?(更好)
干杯 您有一些选择,我建议根据您的需要进行组合,但您也希望在各个方面进行防御性编码,因为内容作者有可能做他们不应该做的事情 您可以为模板设置一些默认值,以便它们始终具有初始值。选择模板并突出显示“生成器”选项卡后,从功能区中选择“选项”选项卡,然后添加标准值 将在模板下添加一个名为
\u标准值的新项目,您可以在那里设置默认值。确保已在渲染上设置了数据源位置
和数据源模板
字段,这将导致
不过,您仍然需要防御性地编写代码。如何做到这一点取决于你自己。例如,如果某些字段设置不正确,则可能根本不显示组件,或者返回不同的视图以显示组件不正确:
public class WidgetController : GlassController
{
public ActionResult Index()
{
var configItem = GetDataSourceItem<ILocationConfiguration>();
if (configItem.Longitude == null && configItem.Latitude == null)
return PartialView("~/Views/Components/Shared/IncorrectSettings.cshtml");
return PartialView("~/Views/Components/Widget/Index.cshtml", configItem);
}
}
公共类WidgetController:GlassController
{
公共行动结果索引()
{
var configItem=GetDataSourceItem();
if(configItem.Longitude==null&&configItem.Latitude==null)
返回PartialView(“~/Views/Components/Shared/IncorrectSettings.cshtml”);
返回PartialView(“~/Views/Components/Widget/Index.cshtml”,configItem);
}
}
(上面的示例正在使用,我知道您没有使用它,但我强烈建议您使用它或在任何情况下都使用它。尽管示例仍然有效。)
您也可以在视图本身中进行一些检查,尽管我自己不会在其中放入太多代码。根据组件的不同,有时我们不会在体验编辑器模式下显示渲染组件。下面的示例允许在EE模式下编辑值,但如果设置了值,则渲染脚本块和组件:
@model Sitecore.Mvc.Presentation.RenderingModel
@if (!Model?.Item?.TemplateID=="guid" ?? true)
{
@Html.Raw("<div class=\"error\">Incorrect Datasource</div>")
return;
}
@if (Sitecore.Context.PageMode.IsExperienceEditor)
{
<!-- This allows component settings to be edited in EE mode -->
<div>
Longitude: @Html.Sitecore().Field("lng", Model.Item)
Latitude: @Html.Sitecore().Field("lat", Model.Item)
Zoon: @Html.Sitecore().Field("zoom", Model.Item)
</div>
}
else
{
string lng = Model.Item["lng"],
lat = Model.Item["lat"],
zoom = Model.Item["zoom"];
if (!string.IsNullOrEmpty(lng) && !string.IsNullOrEmpty(lat) && !string.IsNullOrEmpty(zoom))
{
<script>
var options = { lat: @lat, lng: @lng, zoom: @zoom }
</script>
<div>
set up the component in normal mode
</div>
}
}
@model Sitecore.Mvc.Presentation.RenderingModel
@如果(!Model?.Item?.TemplateID==“guid”?true)
{
@Html.Raw(“不正确的数据源”)
返回;
}
@if(Sitecore.Context.PageMode.IsExperienceEditor)
{
经度:@Html.Sitecore().Field(“lng”,Model.Item)
纬度:@Html.Sitecore().Field(“lat”,Model.Item)
Zoon:@Html.Sitecore().Field(“缩放”,Model.Item)
}
其他的
{
字符串lng=型号项目[“lng”],
lat=型号。项目[“lat”],
缩放=模型。项目[“缩放”];
如果(!string.IsNullOrEmpty(lng)和&!string.IsNullOrEmpty(lat)和&!string.IsNullOrEmpty(zoom))
{
var options={lat:@lat,lng:@lng,zoom:@zoom}
在正常模式下设置组件
}
}
有很多不同的方法可以实现上述功能,包括检查JavaScript本身以及如何调用组件的代码,但我一直试图让它保持自包含和简单 您使用的是视图渲染还是控制器渲染?如果您正在使用控制器,您可能希望检查RenderingContext.Current.Rendering.Datasource
是否为空,否则请使用另一个视图声明“请设置数据源”。确认你是否在使用数据源,我会用样本回答。谢谢你的回复。我正在使用控制器渲染。我正在使用呈现项@Model,并设置了一个数据源(itme树中的路径)来选择一个内容项。但是javascript将失败,因为它首先呈现控制器视图,然后提取关联的项…好的。听起来您可以在项目首次创建时将其上的一些标准值设置为默认值,或者在使用这些值时使Javascript更具防御性……是的,问题是如何设置?!;-)我正在使用类似addmarker=@Html.Raw(optionsObject.addmarker)的东西;但这给了我一个javascript错误“意外”;如果这还没有定义的话。如果是的话,它工作得很好。我如何检查(!@Html.Raw(optionsObject.addmarker))[因为这不起作用…]谢谢你的回答!我会尝试一些东西,但我担心我需要重新设计我的方法。。。