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

3

设置

模型

POCOs,Glass Mapper需要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将其称为视图渲染,在Sitecore模型定义中,模型指向Sample.Parent

@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

这个可能吗?

示例代码经过简化,但应该能够捕捉到我想要做的事情。基本上我想使用泛型类型来重用更多代码。由于外部限制,我只能使用Glass Mapper 3。我看到的错误要么是Sitecore找不到类型,要么是“对象引用未设置”(当这种情况发生时,它似乎使用Sitecore.Mvc.Presentation.RenderingModel, Sitecore.Mvc作为模型)。

还是我疯了吗? :) 有更好的方法来实现这个吗?


当你说“模型指向Sample.Parent”时,你是否在/sitecore/layout/Models下创建了一个模型定义,并将其设置为/sitecore/layout/Renderings下的View Rendering定义中的“Model”字段?我通常不使用泛型,而是使用模型继承... - jammykam
@jammykam 是的,没错。在写完这篇文章后,我尝试了继承方法,它在这种情况下确实起作用。不过,这就需要我定义诸如class MyType : Parent<Article>这样的类型,然后从Sitecore引用它。对我来说,这有点打败了目的。至少我不必编写重复的代码,但我必须在Sitecore中添加每个类型的引用。幸运的是,视图可以保留泛型类型声明。 - Simon Ingeson
1
据我所知,在Sitecore中,您必须添加对类型的引用,否则视图将期望一个类型为“RenderingModel”的对象,因此无法避免这种情况。如果正确设置模板继承,则通常不会出现问题,因为您始终会绑定到最具体的模板。在上面的特定示例中,您还可以使用类型推断:http://glass.lu/Mapper/Sc/Tutorials/Tutorial17 - jammykam
@jammykam 谢谢!我会研究一下并报告我的发现 :) - Simon Ingeson
1个回答

1
我认为Glass尝试处理通用字符串可能会遇到困难(说实话,我从未设计它来处理通用字符串)。
如果您使用的是V4,则无需在Sitecore中定义模型。将模型字段留空,Glass应该可以从cshtml文件中的@inherits声明中解析出模型。

既然没有其他办法,我会将这个标记为被接受的答案,尽管我的情况阻止了我升级到Glass Mapper的V4版本。 - Simon Ingeson
将其记录为一个功能请求,我们可以在未来的V4版本中研究它,但我们不会在V3中添加新功能。 - Michael Edwards
@smonn 不确定你们两个是否阅读过这篇文章,可能会有用:http://jockstothecore.com/customizing-the-model-within-sitecore-mvc/ - jammykam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接