传递到字典中的模型项的类型为“Sitecore.Mvc.Presentation.RenderingModel”,但此字典需要类型为“X”的模型项

时间:2013-09-16 21:02:04

标签: asp.net-mvc-3 razor sitecore sitecore7

我正在使用Sitecore 7和ASP.NET-MVC 3构建解决方案,并尝试使用this blog post by john west中所述的自定义模型类。

我在SO上报告了其他一些问题,报告了与ASP.NET-MVC(没有Sitecore)类似的错误,通常与在控制器代码中传递错误类型的对象有关,或者{{}存在配置错误1}}文件,但似乎都不是这里的问题。

3 个答案:

答案 0 :(得分:3)

这个问题是在您创建视图渲染时引起的(可能是其他人但我还没有尝试过)并且您还没有在sitecore中设置模型,因此sitecore正在传递其默认模型。

要解决此问题,您必须转到布局部分并创建模型。 这是sitecore'/ sitecore / layout / Models /'中的路径,在此文件夹中创建一个'Model'项,在模型类型字段中,以'my.model.namespace,my'的格式添加对模型的引用。汇编'没有报价。

您的模型需要继承“Sitecore.Mvc.Presentation.IRenderingModel”,它强制您实现“初始化”方法,在此处您将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;
        }
    }
}
}

然后你必须进入视图渲染(或者可能是其他类型的渲染),然后在“模型”字段中单击插入链接并单击新创建的模型。

答案 1 :(得分:3)

当控制器渲染调用返回ActionResult对象而不是PartialViewResult的控制器方法时,可能会导致此错误。在我的情况下,我有一个与布局相关的渲染模型,我相信Sitecore试图传递给我的控制器渲染。

答案 2 :(得分:0)

在基于 View Rendering 模板创建渲染时使用RenderingModel。此模型由sitecore MVC管道创建,并自动分配给视图。

要控制要绑定到视图的模型,您可能希望使用 Controller Rendering ,然后可以从控制器传入您自己的模型。