【问题标题】:The model item passed into the dictionary is of type 'Sitecore.Mvc.Presentation.RenderingModel', but this dictionary requires a model item of type 'X'传入字典的模型项的类型为“Sitecore.Mvc.Presentation.RenderingModel”,但此字典需要类型为“X”的模型项
【发布时间】:2013-09-16 21:02:04
【问题描述】:

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

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

【问题讨论】:

  • 显示你的控制器并查看代码
  • 代码与链接博文中的代码相同。

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


【解决方案1】:

当您创建视图渲染(可能是其他的,但我没有尝试过)并且您没有在 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;
        }
    }
}
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • Sitecore 将“@model RenderingModel”添加到视图时,我的 MVC4 应用程序找不到默认模型并声明“名称模型在当前上下文中不存在”。我有正确的 dll 引用,并且我的 View 的 Web.config 与 Razor 2.0 和 MVC 4.0 匹配。有什么建议吗?
      • 我认为是玻璃映射器搞砸了。我必须将 GlassView 的继承添加到视图中:@inherits Glass.Mapper.Sc.Web.Mvc.GlassView
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2013-10-17
      • 2020-09-08
      • 2015-09-27
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多