2014-09-02 89 views
3

我們在Sitecore中使用Glass Mapper,通過我們的模型我們可以獲得sitecore字段的值。但是我想通過使用該模型輕鬆獲取sitecore字段(sitecore字段類型),而不用硬編碼任何字符串(當使用GetProperty()時,您需要屬性名稱字符串)到方法中。如何從glassmapper映射的對象屬性獲取sitecore字段?

所以我寫了這個東西來實現這個,但是我不滿意2種類型需要在使用時傳入,因爲當你有一個長的模型標識符時它看起來很糟糕。

public static string SitecoreFieldName<T, TU>(Expression<Func<TU>> expr) 
    { 
     var body = ((MemberExpression)expr.Body); 
     var attribute = (typeof(T).GetProperty(body.Member.Name).GetCustomAttributes(typeof(SitecoreFieldAttribute), false)[0]) as SitecoreFieldAttribute; 
     return attribute.FieldName; 
    } 

最理想的方法是能夠像這樣得到它Model.SomeProperty.SitecoreField()。但我無法弄清楚如何從那裏做出反應。因爲這可能是任何類型的擴展。

謝謝!

+0

我知道我應該檢查空數組。所以忽略這個。 – zhankezk 2014-09-02 14:41:30

+2

那麼你的問題是什麼?看起來很簡單,而且對我來說是通用的。 – 2014-09-03 07:27:14

+0

問題是要改進它。在這種情況下,您需要傳入兩種類型才能使其工作,而在數據綁定上下文中使用它時,它在aspx頁上看起來不太好。 – zhankezk 2014-09-03 10:08:32

回答

4
public static string SitecoreFieldName<TModel>(Expression<Func<TModel, object>> field) 
{ 
    var body = field.Body as MemberExpression; 

    if (body == null) 
    { 
     return null; 
    } 

    var attribute = typeof(TModel).GetProperty(body.Member.Name) 
     .GetCustomAttributes(typeof(SitecoreFieldAttribute), true) 
     .FirstOrDefault() as SitecoreFieldAttribute; 

    return attribute != null 
     ? attribute.FieldName 
     : null; 
} 

注意,我把inherit=trueGetCustomAttributes方法調用。
否則繼承的屬性將被忽略。

+0

對不起,我不能upvote,但謝謝!這正是我所期待的。 – zhankezk 2014-09-03 10:23:51

0

我不明白爲什麼我的問題得到了投票。所以你認爲它已經是完美的代碼了?

與其它高級開發人員的幫助下,我今天改進它,所以它不需要2種更多的和更清晰的使用語法:

public static Field GetSitecoreField<T>(T model, Expression<Func<T, object>> expression) where T : ModelBase 
    { 
     var body = ((MemberExpression)expression.Body); 
     var attributes = typeof(T).GetProperty(body.Member.Name).GetCustomAttributes(typeof(SitecoreFieldAttribute), false); 
     if (attributes.Any()) 
     { 
      var attribute = attributes[0] as SitecoreFieldAttribute; 
      if (attribute != null) 
      { 
       return model.Item.Fields[attribute.FieldName]; 
      } 
     } 
     return null; 
    } 

,我可以只是這樣稱呼它:

GetSitecoreField(Container.Model<SomeModel>(), x => x.anyField) 

希望它可以幫助任何人使用Sitecore使用Glass Mapper並希望從模型屬性獲取當前sitecore字段。