使用Glass Mapper在Sitecore视图渲染中使用泛型类型

本文关键字:泛型类型 视图 Glass Mapper Sitecore 使用 | 更新日期: 2023-09-27 18:04:56

设置

型号

玻璃映射器需要POCO、virtual

using System.Collections.Generic;
using Glass.Mapper.Sc.Configuration.Attributes;
using Glass.Mapper.Sc.Fields;
namespace Sample
{
    public class Parent<T>
    {
        [SitecoreId]
        public virtual Guid Id { get; set; }
        public virtual string Title { get; set; }
        public virtual IEnumerable<T> Children { get; set; }
    }
    public class Article
    {
        [SitecoreId]
        public virtual Guid Id { get; set; }
        public virtual string Title { get; set; }
        public virtual string Text { get; set; }
    }
    public class Teaser
    {
        [SitecoreId]
        public virtual Guid Id { get; set; }
        public virtual string Title { get; set; }
        public virtual Image Banner { get; set; }
    }
}

视图

Sitecore引用为视图渲染,模型指向Sample.Parent(请参阅下面的Sitecore模型定义(。

@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<Sample.Parent<Sample.Article>>
<h1>@Editable(x => x.Title)</h1>
<div class="article-list">
    @foreach (var article in Model.Children)
    {
        <article class="article">
            <h2 class="article-title">@Editable(article, x => x.Title)</h2>
            <div class="article-content">@Editable(article, x => x.Text)</div>
        </article>
    }
</div>
@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<Sample.Parent<Sample.Teaser>>
<h1>@Editable(x => x.Title)</h1>
<div class="teaser-list">
    @foreach (var teaser in Model.Children)
    {
        <article class="teaser">
            <h2 class="teaser-title">@Editable(teaser, x => x.Title)</h2>
            <div class="teaser-banner">@RenderImage(teaser, x => x.Banner)</div>
        </article>
    }
</div>

Sitecore模型定义

这是我不确定我做得对不对的地方。这些是我定义为Sitecore模型的模型类型(在/sitecore/layout/models下(。

  • Sample.Parent`1[T], Sample

    也尝试过(没有成功(:

    • Sample.Parent, Sample
    • Sample.Parent`1[Sample.Article, Sample], Sample
    • Sample.Parent<Sample.Article>, Sample(
  • Sample.Article, Sample

  • Sample.Teaser, Sample

这可能吗

示例代码被简化了,但应该能捕捉到我想要做的事情。基本上,我希望能够使用泛型类型来重用更多的代码。由于外部限制,我不能使用任何东西,除了玻璃映射器3。我看到的错误要么是Sitecore找不到类型,要么是"未设置对象引用"(发生这种情况时,它似乎使用Sitecore.Mvc.Presentation.RenderingModel, Sitecore.Mvc作为模型(。

还是我疯了?:(有更好的方法来实现这一点吗?

使用Glass Mapper在Sitecore视图渲染中使用泛型类型

我认为Glass处理泛型字符串的方式可能存在困难(老实说,我从未将其设计为处理泛型字符串(。

如果您使用的是V4,那么您不需要在Sitecore中定义模型。将model字段留空,Glass应该从cshtml文件中的@inherits减速中解析模型。