2011-10-28 10 views
5

モデルのプロパティから属性値が必要なメソッドでHTMLヘルパを拡張しました。だから私はカスタム属性をそのように定義しました。MVC3 HTMLヘルパーでカスタム属性値を取得できない

public class ChangeLogFieldAttribute : Attribute { 
     public string FieldName { get; set; } 
    } 

私のモデルではこのように使用されています。

私のヘルパーメソッドでは、属性にプロパティが使用されている場合、次のコードでmy属性のFieldName値を取得しています。

 var itemName = ((MemberExpression)ex.Body).Member.Name; 

     var containerType = html.ViewData.ModelMetadata.ContainerType; 
     var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault(); 
     if (attribute != null) { 
      itemName = attribute.FieldName; 
     } 

ただし、このコードに到達すると、containerTypeがnullであるため例外が発生します。

私はこれを正しく実行しているかどうかはわかりませんが、これまでのところ4つの異なるソースから取得しました。私の問題や代替案を示唆することができれば、感謝しています。

ありがとうございました。 SOLUTION

WITH

UPDATE私はそれ一部を調整する必要がありましたが、私は、ダーリンディミトロフのソリューションを使用していました。ここに私が加えたものがあります。属性メタデータの存在を確認しなければならず、すべてが良好でした。

 var fieldName = ((MemberExpression)ex.Body).Member.Name; 

     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
      fieldName = (string)metadata.AdditionalValues["fieldName"]; 
     } 
+0

を、あなたは 'metadata.PropertyName'の代わりに使用することができます'((MemberExpression)ex.Body).Member.Name'。しかし、これはフィールド名では機能しません。また、 '.FieldName'や' .MemberName'も表示されません。 –

答えて

11

あなたは気づい属性メタデータを作ることができます:ヘルパー内部

public class ChangeLogFieldAttribute : Attribute, IMetadataAware 
{ 
    public string FieldName { get; set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["fieldName"] = FieldName; 
    } 
} 

、その後:プロパティ名を取得するには

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var fieldName = metadata.AdditionalValues["fieldName"]; 
関連する問題