Sitecore - 如果item为NULL,则呈现代码

时间:2017-08-29 10:46:34

标签: javascript controller sitecore rendering nothing

在Sitecore中,您可以使用

轻松渲染上下文项的值
@RenderingContext.Current.Rendering.Item["itemname"]

但是:当我将Controller Rendering放置到占位符时,尚未分配任何内容。因此不会呈现任何内容,因此我无法检查是否为空。

我的具体问题:
我想将数据库项的值添加到调用的参数中。

var options = {{lat: @RenderingContext.Current.Rendering.Item["lat"],
    lng: @RenderingContext.Current.Rendering.Item["lng"]},
    zoom: @RenderingContext.Current.Rendering.Item["zoom"]};

因为只有NOTHING(尚未)部分视图无法加载,因为没有相关内容(还)==> javascript错误。如果有内容,它可以正常工作。

那我怎么能

  • 将默认关联内容项添加到控制器渲染(mhhhh)
  • 检查是否?没有?一片空白? (优于)

有什么想法吗? 谁有问题?

干杯!

1 个答案:

答案 0 :(得分:1)

你有几个选择,我建议根据你的需要组合一些东西,但你也希望在所有方面进行防御性编码,因为内容作者有可能做他们不应该做的事情!

您可以为模板设置一些默认值,以便它们始终具有初始值。选中您的模板并突出显示 Builder 选项卡,从功能区中选择选项选项卡,然后添加标准值

Standard Values

将在模板下添加名为__Standard Values的新项目,您可以在其中设置默认值。确保您在渲染中设置Datasource LocationDatasource Template字段,这将导致the prompt to create/select datasource item

你仍然需要防守代码。你如何做到这一点取决于你。例如,如果某些字段设置不正确,那么您可能根本不显示该组件或返回不同的视图以显示它是不正确的:

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

(以上示例使用Glass Mapper,我知道您没有使用它,但我强烈推荐它或在任何情况下使用strongly types models。示例仍然有效。)

你也可以在View中进行一些检查,虽然我不会在那里放太多代码。根据组件的不同,有时我们不会在体验编辑器模式下显示渲染的组件。下面的示例允许在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>
    }
}

有很多不同的方法可以实现上述目的,包括在JavaScript本身进行检查以及如何调用组件的代码,但我试图保持它自包含且简单。