2011-07-11 17 views
2

DisplayAttribute.GroupNameプロパティの有効な使用法を理解しようとしています。DisplayAttribute.GroupNameプロパティは何のために使用されますか?

MSDN氏は述べています:

UIでグループフィールドに使用される値。

しかし、私はそれを包括的な説明と呼んでいません。 GroupNameを使用して特定のフィールドの周りにグループボックスを作成できると私は考えています。しかし、次のようにします。

このプロパティを使用してGroupNameプロパティの値を取得しないでください。 GetDescriptionメソッドを代わりに使用してください。ヌル値または空の文字列は です。

と矛盾するようです。

私のフィールドの周りにグループボックスを表示するには、このプロパティは何ですか(カスタムテンプレートやカスタムModelMetadataProviderを使用している可能性があります)。

答えて

1

MVC RTMソースコードには、使用の兆候はありません。

"GetDescription"の注釈はドキュメントのコピー/ペーストエラーである可能性があります(各文字列プロパティにはローカライズ可能な値を返すGetXXXの対応があるようです)ので、この場合はおそらく "GetGroupName"にする必要があります。

UPDATE: 私はそれを正確に使用します:UI視点から一緒に属するグループフィールド。これはモデル上のデータ注釈だけなので、これらのフィールドはUI上の「何らかの」論理グループに属すると宣言しますが、具体的な表示の詳細はメタデータに基づいてモデルを表示する「UIエンジン」に依存します。 私はUI上でこれを「レンダリング」する最も意味のある方法は、あなたが言ったことです:グループ化されたフィールドをセクションまたはフィールドセットにラップすることです。

もちろん、この属性プロパティに基づいて、UIで「自動」(メタデータを調べてセクションを生成するカスタムコードを書くことなく)なグルーピングを行うMVCや他のカスタム拡張の拡張があるかもしれません。しかし、私は、このような拡張が、あなたが現在やっているのと非常によく似たことをすると確信しています。

+0

現在は使用されていません - 十分に公正ですが、何のために設計されていますか?私はグループボックスのためにそれを使用することができますか?私はちょうどMVCが実際に全く別の何かのためにこのプロパティを使用し始めるときにトイレで手で目を覚ますことを望んでいません... –

+0

それを使用するといいです - 私もそれを使用しようとしていますが、私はわかりませんどのように "それを"取得する。 –

0

私はGroupNameのがより簡単にアクセスできるように、このクラスを書くことになった:

public class ExtendedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    public const string Key_GroupName = "GroupName"; 

    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     ModelMetadata modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
     DisplayAttribute displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault(); 

     if (displayAttribute != null) 
      modelMetadata.AdditionalValues[ExtendedDataAnnotationsModelMetadataProvider.Key_GroupName] = displayAttribute.GroupName; 

     return modelMetadata; 
    } 
} 

そして、この拡張メソッド:

public static string GetGroupName(this ModelMetadata modelMetadata) 
{ 
    if (modelMetadata.AdditionalValues.ContainsKey(ExtendedDataAnnotationsModelMetadataProvider.Key_GroupName)) 
     return (modelMetadata.AdditionalValues[ExtendedDataAnnotationsModelMetadataProvider.Key_GroupName] as string); 

    return null; 
} 

が出典:これについてhttp://bradwilson.typepad.com/blog/2010/01/why-you-dont-need-modelmetadataattributes.html

0

どのように!! !

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Reflection; 
using System.Web; 
using System.Web.Mvc; 

namespace System.Web.Mvc 
{ 
    public static class DisplayGroup 
    { 
     public static MvcHtmlString DisplayGroupName(this HtmlHelper helper, string groupName) 
     { 
      return MvcHtmlString.Create(groupName); 
     } 

     public static MvcHtmlString DisplayGroupNameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
     { 
      var type = typeof(TModel); 
      PropertyInfo propertyInfo = null; 

      var member = (MemberExpression)expression.Body; 
      var property = (PropertyInfo)member.Member; 
      var name = property.Name; 

      var metadataTypeInfo = type.GetCustomAttribute<MetadataTypeAttribute>(); 

      if (metadataTypeInfo != null) 
      { 
       var metadataType = metadataTypeInfo.MetadataClassType; 
       propertyInfo = metadataType.GetProperties().Where(x => x.Name == name).FirstOrDefault(); 
       if (propertyInfo == null) 
       { 
        propertyInfo = type.GetProperties().Where(x => x.Name == name).FirstOrDefault(); 
       } 
      } 
      else 
      { 
       propertyInfo = type.GetProperties().Where(x => x.Name == name).FirstOrDefault(); 
      } 

      string output = ""; 

      var dattr = propertyInfo.GetCustomAttribute<DisplayAttribute>(); 
      if (dattr != null) 
      { 
       if (dattr.GroupName == null) 
       { 
        output = propertyInfo.Name; 
       } 
       else 
       { 
        output = dattr.GroupName; 
       } 
      } 
      else 
      { 
       output = propertyInfo.Name; 
      } 

      return MvcHtmlString.Create(output); 
     } 

    } 
} 




public class MyModel 
    { 
     [Display(Name = "Number",GroupName="Invoice")] 
     string InvNo { get; set; } 
    } 

をして、簡単に書く::働かなければならない

@Html.DisplayGroupNameFor(x => x.InvNo) 

注: 名前空間があるべきSystem.Web.Mvc

を更新: クールなことは、あなたであれば、ということですあなたのdataAnnotationに定義されたMetaDataTypeクラスを持っていれば、これも期待どおりに動作しますed。

関連する問題