2017-08-29 52 views
0

在Sitecore的,你可以很容易地通过使用Sitecore的 - 渲染代码,如果项目是NULL

@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"]}; 

由于根本就NOTHING(还)的局部视图加载失败因为没有相关联的内容(还)==> JavaScript错误。如果有内容,它工作正常。

所以,我怎么能

  • 添加默认关联的内容项到控制器渲染(mhhhh)
  • 检查?什么都没有?一片空白? (更好)

任何想法? 任何人谁得到了我的问题?

干杯!

+0

你使用视图还是控制器渲染?如果你正在使用Controller,可能要检查'RenderingContext.Current.Rendering.Datasource'是否为空,否则请使用另一个视图,说明“请设置数据源”。确认您是否正在使用数据源,然后用样本回答。 – jammykam

+0

感谢您的回复。我正在使用控制器渲染。我使用渲染Item @Model,并设置了一个数据源(在它的树中的路径)来选择一个内容项目。但JavaScript将失败,因为它首先呈现控制器视图,然后拉动相关的项目... – David

+0

好的。听起来像你可以设置一些'__Standard值在你的项目默认为_something_时,它是第一次创建,或使您的Javascript更具防御性,当使用值... – jammykam

回答

1

你有几个选项提供给你,我会建议的根据您的需要的东西的组合,但你也想在各方面被防守编码,因为内容创作者必须做的事情,他们不应该的潜力!

您可以为你的模板一些默认值,使他们始终有一个初始值。有了您的模板中选择和生成器标签强调,从色带选择选项选项卡,然后添加标准值

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。)

你也可以在视图本身做一些检查,但我不会在这里放太多的代码我。根据组件的不同,有时我们不会在体验编辑器模式下显示渲染的组件。下面的示例允许在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本身,使检查你如何调用你的组件的代码,但我试图保持它自包含和简单的例子。

+0

谢谢你的答案!我会尝试一些事情,但恐怕我需要重做我的方法...... – David