【问题标题】:Map Multilist field with objects of different templates使用不同模板的对象映射 Multilist 字段
【发布时间】:2014-08-29 13:02:46
【问题描述】:

我在一个项目上有一个多列表字段,它可以包含来自不同模板的项目。我想知道是否有任何方法可以映射此字段,以便对象根据其模板映射到正确的模型。比如:

public interface IPerson
{
    string FullName {get; set;}
}

[SitecoreType(TemplateId="....")]
public class Professor
{
    [SitecoreField]
    public string Prefix {get; set;}
    [SitecoreField]
    public string FirstName {get; set;}
    [SitecoreField]
    public string LastName {get; set;}

    public string FullName
    {
        return string.format("{0} {1} {2}", Prefix, FirstName, LastName)
    }
}

[SitecoreType(TemplateId="....")]
public class Student
{
    [SitecoreField]
    public string FirstName {get; set;}
    [SitecoreField]
    public string LastName {get; set;}

    public string FullName
    {
        return string.format("{0} {1}", FirstName, LastName)
    }
}

[SitecoreType(TemplateId="....")]
public class ClassSession
{
    [SitecoreField]
    public IEnumerable<IPerson> Participants {get; set;}
}

在这种情况下,我希望 Participants 属性包含 StudentProfessor 对象,因为它们以不同的方式实现 Fullname 属性。

【问题讨论】:

    标签: sitecore glass-mapper


    【解决方案1】:

    您可以在 Glass.mapper 中使用推断类型,推断类型允许您根据正在加载的项目的模板加载更具体的类型。 :

    public interface IPerson
    {
        string FullName {get; set;}
    }
    
    [SitecoreType(TemplateId="....", AutoMap = true)]
    public class Professor : IPerson
    {
        [SitecoreField]
        public string Prefix {get; set;}
        [SitecoreField]
        public string FirstName {get; set;}
        [SitecoreField]
        public string LastName {get; set;}
    
        public string FullName
        {
            return string.format("{0} {1} {2}", Prefix, FirstName, LastName)
        }
    }
    
    [SitecoreType(TemplateId="....", AutoMap = true)]
    public class Student : IPerson
    {
        [SitecoreField]
        public string FirstName {get; set;}
        [SitecoreField]
        public string LastName {get; set;}
    
        public string FullName
        {
            return string.format("{0} {1}", FirstName, LastName)
        }
    }
    
    [SitecoreType(TemplateId="....", AutoMap = true)]
    public class ClassSession
    {
        [SitecoreField(Setting = SitecoreFieldSettings.InferType)]
        public IEnumerable<IPerson> Participants {get; set;}
    }
    

    请注意,我在您的类属性中添加了AutoMap = true,并将您的多列表属性属性更改为:

    [SitecoreField(Setting = SitecoreFieldSettings.InferType)]

    如需了解更多详情,请访问此处的麦克风教程: http://glass.lu/docs/tutorial/sitecore/tutorial17/tutorial17.html

    编辑

    您需要在配置加载器中包含您的程序集,在您的解决方案中找到 GlassMapperScCustom 类。然后您应该更新 GlassLoaders 方法:

    public static IConfigurationLoader[] GlassLoaders()
        {
            var attributes = new AttributeConfigurationLoader("Your assembly name");
    
            return new IConfigurationLoader[] {attributes };
        }
    

    【讨论】:

    • 谢谢@Ahmed。这看起来完全像我想要的,不幸的是它不起作用。这些项目仍被映射为IPersonProxy,并且字段未正确填充。
    • 我刚刚更新了我的答案,你需要做最后一步
    • 我现在在 GlassMapperSc:context.Load(GlassMapperScCustom.GlassLoaders()); 的这一行上得到“您不能有重复的属性映射。属性名称:名称类型:名称”
    • 不知道你为什么会这样,我刚刚检查了导致这个异常的代码,你的一个模型中似乎有一些重复的属性。第 81 行:github.com/mikeedwards83/Glass.Mapper/blob/master/Source/…
    • 这到底是什么意思?同一个 Sitecore 字段被映射到两个不同的属性?如果是这样,我经常在 Multilist 字段的情况下这样做,以便我可以使用相同的模型进行 Sitecore 搜索查询。我将原始值映射到IEnumerable&lt;ID&gt;,然后还有IEnumerable&lt;Model&gt;的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多