你有几个选项提供给你,我会建议的根据您的需要的东西的组合,但你也想在各方面被防守编码,因为内容创作者必须做的事情,他们不应该的潜力!
您可以为你的模板一些默认值,使他们始终有一个初始值。有了您的模板中选择和生成器标签强调,从色带选择选项选项卡,然后添加标准值
一个新项目称为__Standard Values
将模板下加入,你可以在那里设置默认值。请确保您设置了您的渲染Datasource Location
和Datasource 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本身,使检查你如何调用你的组件的代码,但我试图保持它自包含和简单的例子。
你使用视图还是控制器渲染?如果你正在使用Controller,可能要检查'RenderingContext.Current.Rendering.Datasource'是否为空,否则请使用另一个视图,说明“请设置数据源”。确认您是否正在使用数据源,然后用样本回答。 – jammykam
感谢您的回复。我正在使用控制器渲染。我使用渲染Item @Model,并设置了一个数据源(在它的树中的路径)来选择一个内容项目。但JavaScript将失败,因为它首先呈现控制器视图,然后拉动相关的项目... – David
好的。听起来像你可以设置一些'__Standard值在你的项目默认为_something_时,它是第一次创建,或使您的Javascript更具防御性,当使用值... – jammykam