Javascript Sitecore-项为NULL时的呈现代码

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

在Sitecore中,您可以使用

@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))[因为这不起作用…]谢谢你的回答!我会尝试一些东西,但我担心我需要重新设计我的方法。。。