1

我一直在关注这篇文章,以了解 T 的惰性字段,我想我理解,但是我无法获取以这种方式加载的零件的相关字段数据

目标 - 在博客文章中显示博客文章作者的照片。

  • 我想添加一个内容部分“内容作者”
  • 部分编辑器应显示为果园用户的下拉列表。(不管内容所有者 cms 用户应该可以选择作者)
  • 我已将图像上传字段添加到用户内容类型
  • 我想在内容作者部分的视图中显示前端用户的图像

对于第一部分,我创建了内容类型并使用 UserPart 的惰性 Filed 来获取用户名。但是,当我尝试获取 UserPart 的关联字段时。似乎有任何。

public class ContentAuthorRecord : ContentPartRecord
{
    public virtual string AuthorEmail { get; set; }
}

public class ContentAuthorPart : ContentPart<ContentAuthorRecord>
{
    internal readonly LazyField<UserPart> Owner = new LazyField<UserPart>();

    public string AuthorEmail
    {
        get { return Record.AuthorEmail; }
        set { Record.AuthorEmail = value; }
    }

    public UserPart Author
    {
        get { return Owner.Value; }
        set { Owner.Value = value; }
    }

    public string AuthorName
    {
        get
        {
            if (Author == null)
                return "Riders for health";
            else
            {
                return Author.UserName;
            }
        }

    }
}



public class ContentAuthorHandler :ContentHandler
{
        private readonly IContentManager _contentManager;

        public ContentAuthorHandler(IRepository<ContentAuthorRecord> repository, IContentManager contentManager)
        {
            _contentManager = contentManager;

            OnActivated<ContentAuthorPart>(SetUpCustomPart);
            Filters.Add(StorageFilter.For(repository));
        }

        private void SetUpCustomPart(ActivatedContentContext content, ContentAuthorPart part)
        {

            // Setup the getter of the lazy field
            part.Owner.Loader(() => _contentManager.Query<UserPart, UserPartRecord>().List().FirstOrDefault(x => x.Email == part.AuthorEmail));

        }

  }

我希望能够通过类似的方式访问该字段

(ImageUploadField.Fields.ImageUploadField)Author.Fields.FirstOrDefault(x => x.Name == "照片");

在零件类中形成

(虽然这让每件事都变得有点脆弱,硬编码一个字段名,但我不知道如何 eles 去做)

更多信息

我有一个 HeaderPart,其中通过显示处理程序中的 cms(不在代码中)添加了一个 Image 字段我像这样获取字段

 protected override DriverResult Display(HeaderPart part, string displayType, dynamic shapeHelper)
        {
            if (part.HeaderType == HeaderType.Full_width_hero_image)
            {
                var field = (ImageUploadField) part.Fields.FirstOrDefault(f => f.Name == "HeaderImage");

                if (field != null)
                {
                    return ContentShape("Parts_Header_ImageHero",
                        () => shapeHelper.Parts_Header_ImageHero(ImagePath: field.ImagePath, ImageTitle: field.FileName));
                }
                return null;
            }
            if (part.HeaderType == HeaderType.Full_width_hero_video)
            {
                return ContentShape("Parts_Header_VideoHero", () => shapeHelper.Parts_Header_VideoHero(VideoUrl: part.VideoUrl));
            }
            if (part.HeaderType == HeaderType.Body_width_video)
            {
                return ContentShape("Parts_Header_VideoBody", () => shapeHelper.Parts_Header_VideoBody(VideoUrl: part.VideoUrl));
            }
            return null;
        }

这行得通,但是我可以对加载到惰性字段中的部分执行相同的操作。

4

2 回答 2

5

首先转换为动态,然后语法变得更简单:((dynamic)part.ContentItem).NameOfTheType.NameOfTheField.NameOfTheProperty

于 2013-01-13T09:41:45.387 回答
0

如果您已通过 CMS 界面将字段添加到用户内容类型,它可能已将字段添加到与您期望的部分不同的部分。如果您将字段添加到用户内容类型,默认情况下它会将字段添加到名为“用户”的新部分,而不是“用户部分”。尝试按照以下方式搜索内容项中的所有部分:

(ImageUploadField.Fields.ImageUploadField)Author.ContentItem.Parts
.SelectMany(p => p.Fields).FirstOrDefault(f => f.Name == "Photo");

或直接从“用户”部分:

(ImageUploadField.Fields.ImageUploadField)Author.ContentItem.Parts
.First(p => p.PartDefinition.Name == p.ContentItem.ContentType).Fields
.FirstOrDefault(f => f.Name == "Photo");
于 2013-01-13T00:48:50.740 回答