Orchard Cms在LazyFiled <T>中获取UserPart字段数据

Axe*_*Axe 1 lazy-loading orchardcms

我一直在关注这篇文章为了让我的头围绕T的Lazy字段,我想我理解,但是我无法获得以这种方式加载的零件的相关字段数据

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

  • 我想添加一个内容部分"内容作者"
  • 部件编辑器应显示为果园用户的下拉列表.(无论内容所有者cms用户应该能够选择作者)
  • 我已将图像上传字段添加到用户内容类型
  • 我想在Content Author Part的视图中显示前端用户的图像

对于第一部分,我创建了内容类型,并使用懒惰的Filed of UserPart来获取用户名.但是,当我尝试获取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));

        }

  }
Run Code Online (Sandbox Code Playgroud)

我希望能用这样的东西访问该领域

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

在部分类中形成

(虽然这会让每件事都变得有点脆弱,但是对于一个字段名称进行硬编码,但我不确定它是如何进行的)

更多信息

我有一个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;
        }
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我可以为加载到惰性字段中的部分做同样的事情.

Ber*_*Roy 5

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