我正在使用 Sitecore 7 和 ASP.NET-MVC 3 构建解决方案,并尝试使用john west 的这篇博文中描述的自定义模型类。
我在 SO 上看到了其他几个问题,报告了与 ASP.NET-MVC(没有 Sitecore)类似的错误,通常与在控制器代码中传递错误类型的对象有关,或者\Views\web.config
文件存在配置错误,但似乎都没有成为这里的问题。
我正在使用 Sitecore 7 和 ASP.NET-MVC 3 构建解决方案,并尝试使用john west 的这篇博文中描述的自定义模型类。
我在 SO 上看到了其他几个问题,报告了与 ASP.NET-MVC(没有 Sitecore)类似的错误,通常与在控制器代码中传递错误类型的对象有关,或者\Views\web.config
文件存在配置错误,但似乎都没有成为这里的问题。
当您创建视图渲染(可能是其他人,但我没有尝试过)并且您尚未在 sitecore 中设置模型时,会导致此问题,因此 sitecore 正在传递其默认模型。
要解决此问题,您必须转到布局部分并创建一个模型。这是 sitecore '/sitecore/layout/Models/' 中的路径,在此文件夹中创建一个 'Model' 项目,并在模型类型字段中添加对模型的引用,格式为 'my.model.namespace, my.不带引号的程序集。
您的模型需要继承“Sitecore.Mvc.Presentation.IRenderingModel”,这会强制您实施“Initialize”方法,在这里您将 sitecore 项目中的数据填充到模型的属性中。这是一个示例模型...
namespace Custom.Models.ContentBlocks
{
using Sitecore.Data.Fields;
using Sitecore.Mvc.Presentation;
public class BgImageTitleText : IRenderingModel
{
public string Title { get; set; }
public string BgImage { get; set; }
public string BgImageAlt { get; set; }
public string BgColour { get; set; }
public string CtaText { get; set; }
public string CtaLink { get; set; }
public void Initialize(Rendering rendering)
{
var dataSourceItem = rendering.Item;
if (dataSourceItem == null)
{
return;
}
ImageField bgImage = dataSourceItem.Fields[Fields.ContentBlocks.BgImageTitleTextItem.BgImage];
if (bgImage != null && bgImage.MediaItem != null)
{
this.BgImageAlt = bgImage.Alt;
this.BgImage = Sitecore.Resources.Media.MediaManager.GetMediaUrl(bgImage.MediaItem);
}
var title = dataSourceItem.Fields[Fields.ContentBlocks.BgImageTitleTextItem.Title];
if (title != null)
{
this.Title = title.Value;
}
var link = (LinkField)dataSourceItem.Fields[Fields.ContentBlocks.BgImageTitleTextItem.CtaLink];
if (link != null)
{
this.CtaLink = link.GetLinkFieldUrl();
}
var ctaText = dataSourceItem.Fields[Fields.ContentBlocks.BgImageTitleTextItem.CtaText];
if (ctaText != null)
{
this.CtaText = ctaText.Value;
}
var bgColour = dataSourceItem.Fields[Fields.ContentBlocks.BgImageTitleTextItem.BgColour];
if (bgColour != null)
{
this.BgColour = bgColour.Value;
}
}
}
}
然后你必须去你的视图渲染(或者可能是其他类型的渲染)并在“模型”字段中单击插入链接并单击新创建的模型。
当控制器渲染调用返回ActionResult
对象而不是PartialViewResult
. 就我而言,我有一个与布局相关的渲染模型,我相信 Sitecore 正试图将其传递给我的控制器渲染。
当您基于View Rendering模板创建 Rendering 时使用 RenderingModel。此模型由 sitecore MVC 管道创建并自动分配给视图。
要控制绑定到视图的模型,您可能需要使用Controller Rendering,然后您可以从控制器传入您自己的模型。