3

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

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不同的方式实现属性。

4

1 回答 1

6

您可以在 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)]

有关更多详细信息,请在此处访问 mike 教程: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 };
    }
于 2014-08-29T13:38:34.133 回答