【问题标题】:Sitecore GlassMapper MVC add standard fields to modelSitecore GlassMapper MVC 向模型添加标准字段
【发布时间】:2017-08-30 15:20:23
【问题描述】:

我需要我的商品在特定型号中的排序顺序。

我试过这样但没有运气:

[SitecoreField("__Sortorder")]
public string SortOrder { get; set; }

知道如何在模型中包含标准字段吗?

如果这不可能,实际上在这种情况下我正在使用清单,GlassMapper 的自动映射确实按字母顺序返回它。

这是清单字段的定义:

IEnumerable<Guid> Filter_Tags_To_Shows  {get; set;}

如前所述,列表按字母顺序返回,但由于缺少 sortOrder 字段,之后我没有更改排序。

提前致谢。

【问题讨论】:

  • 上面的代码有什么问题? Glass 根本没有映射该字段,还是映射了该字段但值不正确?您是否尝试将字段类型更改为 int 而不是 string?
  • 是 int 返回 0 , string 返回 null。所以我认为没有完成映射。但是该项目有一个排序值。
  • 您可以尝试将您的字段移动到一个名为 Appearance 的类,并使用 SitecoreType 装饰器和该字段实际来自的 Appearance 类的 TemplateId 来装饰该类吗?就像一个测试。也许对于您的 Glass 版本,您需要该字段存在于您的类所代表的模板上(我不知道这是否是任何版本的 Glass 的要求)。
  • 您能否在问题中添加有关清单字段的详细信息?您在对另一个答案的评论中提到了这一点,但答案已被删除。
  • 好的更新了问题

标签: sitecore sitecore8 glass-mapper


【解决方案1】:

您的Filter_Tags_To_Shows 属性正在返回Guids 的列表,我想您正在做一些事情以从Sitecore 获取链接的项目。这不是最有效的方式,Glass 允许您指定链接的项目类型,它将自动映射。

IEnumerable<FilterTagClass> Filter_Tags_To_Shows  {get; set;}

假设FilterTagClass 具有您的问题中指定的排序顺序:

[SitecoreType(TemplateId={GUID})]
public class FilterTagClass : GlassBase 
{
    [SitecoreField("__Sortorder")]
    public virtual int SortOrder { get; set; }
}

您可以使用 Linq 进行排序:

@foreach (var tag in Filter_Tags_To_Shows.OrderBy(i => i.SortOrder))
{
    // do stuff
}

这是对@DougCouto 答案的重新散列,但请注意,如果您正确设置属性和映射,则无需将 ID 转换为对象。

作为使用Checklist 字段的替代方法,您可以使用Multilist 字段,这将允许您选择标签并根据需要重新排序它们。 Glass 应该按照您当时设置的顺序返回它们。

【讨论】:

    【解决方案2】:

    此属性

    IEnumerable<Guid> Filter_Tags_To_Shows  {get; set;}
    

    将为您提供您在清单字段中选择的项目的 ID 列表。要获取实际项目的排序顺序,您需要将这些 ID 转换为对象:

    var tagsToShow = Filter_Tags_To_Shows.Select(i => SitecoreContext.GetItem<SomeClassType>(i));
    

    假设 SomeClassTypeSortOrder 字段,那么您应该能够访问 tagsToShow 中每个对象的该字段并执行类似的操作:

    var sortedTagsToShow = tagsToShow.OrderBy(i => i.Sortorder);
    

    【讨论】:

    • 谢谢 DoughCouto。如前所述,我将 SortOrder 字段添加到 SomeClassType 但值是 0 作为 int 和 null 作为字符串。 GlassMapper 不知何故不会自动映射。也许我会将它们转换为真正的 Sitecore 项目,然后我有 sortorder 字段。
    【解决方案3】:

    Checklist 和 Multilist 以原始文本形式存储在 Sitecore 数据库中,序列将根据数据源项序列进行更新,您可以尝试以下示例。

    Sitecore.Data.Fields.MultilistField multilistField = item.Fields["FieldName"];
    
    foreach (var child in multilistField.GetItems)
    {
        // It should provide in short order
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多