Sitecore - 如果项目为 NULL,则呈现代码
Sitecore - render Code if item is NULL
在 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)
- 检查是否?没有?一片空白? (更好)
有什么想法吗?
有人遇到过我的问题吗?
干杯!
您有几个选项可供选择,我建议根据您的需要进行组合,但您也希望在所有方面进行防御性编码,因为内容作者有可能做他们不应该做的事情!
您可以为模板设置一些默认值,以便它们始终具有初始值。在您的模板 selected 和 Builder 选项卡突出显示的情况下,select 功能区中的 Options 选项卡,然后添加 标准值
将在模板下添加一个名为__Standard Values
的新项目,您可以在那里设置默认值。确保您已在渲染中设置 Datasource Location
和 Datasource Template
字段,这将导致 the prompt to create/select datasource item.
尽管如此,您仍然需要进行防御性编码。你如何做到这一点取决于你。例如,如果某些字段设置不正确,那么您可能根本没有显示该组件,或者 return 不同的视图显示它是不正确的:
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, I know you are not using it but I would highly recommend it or to use 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 本身中进行检查以及如何调用组件的代码,但我试图保持它的独立性和简单性例子。
在 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)
- 检查是否?没有?一片空白? (更好)
有什么想法吗? 有人遇到过我的问题吗?
干杯!
您有几个选项可供选择,我建议根据您的需要进行组合,但您也希望在所有方面进行防御性编码,因为内容作者有可能做他们不应该做的事情!
您可以为模板设置一些默认值,以便它们始终具有初始值。在您的模板 selected 和 Builder 选项卡突出显示的情况下,select 功能区中的 Options 选项卡,然后添加 标准值
将在模板下添加一个名为__Standard Values
的新项目,您可以在那里设置默认值。确保您已在渲染中设置 Datasource Location
和 Datasource Template
字段,这将导致 the prompt to create/select datasource item.
尽管如此,您仍然需要进行防御性编码。你如何做到这一点取决于你。例如,如果某些字段设置不正确,那么您可能根本没有显示该组件,或者 return 不同的视图显示它是不正确的:
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, I know you are not using it but I would highly recommend it or to use 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 本身中进行检查以及如何调用组件的代码,但我试图保持它的独立性和简单性例子。