2011-10-28 2 views
5

모델의 속성에서 특성 값이 필요한 메서드로 HTML 도우미를 확장했습니다. 그래서 커스텀 애트리뷰트를 이와 같이 정의했다.MVC3 HTML 도우미에서 사용자 지정 특성 값을 가져올 수 없습니다.

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

내 모델에는 다음과 같이 사용됩니다. 속성이 속성을 사용하면 내 도우미 방법에

[Display(Name = "Style")] 
    [ChangeLogField(FieldName = "styleid")] 
    public string Style { get; set; } 

, 나는 내 속성의 필드 이름 값을 얻을 수있는 다음과 같은 코드를 가지고있다.

 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 가지 다른 출처를 찾아 냈습니다. 내 문제 또는 대안에 대한 해결책을 제시 할 수 있다면 감사하게 생각합니다.

감사합니다. 솔루션

내가 일부를 조정할 있었더라도 나는, 대린 디미트로프의 솔루션을 사용 WITH

UPDATE. 여기에 제가 추가 한 것이 있습니다. 나는 속성 metatdata의 존재를 확인해야했고 모두 좋다. 도우미 내부에 다음

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

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

과 :

 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

당신은 속성 메타 데이터를 인식 할 수

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var fieldName = metadata.AdditionalValues["fieldName"]; 
관련 문제