2011-04-27 16 views
3

컨트롤의 이름을 ASP.NET MVC3 형식으로 표시하기 위해 MetadataType을 할당하는 EF4에서 생성 된 부분 클래스가 있는데 예상대로 작동합니다.DisplayAttribute 이름을 가져올 수 없습니다.

동일한 DisplayAttribute을 각 속성에 할당하여 표시된 Name 값을 다른 용도로 다시 가져오고 싶습니다. 내 클래스는 다음과 같습니다

using Domain.Metadata; 

namespace Domain 
{ 
    [MetadataType(typeof(ClassAMetada))] 
    public partial class ClassA 
    {} 
} 

namespace Domain.Metadata 
{ 
    public class ClassAMetada 
    { 
     [Display(Name = "Property 1 Description", Order = 1)] 
     public Boolean Property1; 

     [Display(Name = "Property 2 Description", Order = 2)] 
     public Boolean Property2; 
    } 
} 

나는 이미 3 개 게시물을보고 시도했다 제시된 솔루션 :

하지만 없음 그들 중 속성을 검색 할 수 있습니다 Name va 루; 속성이 없으므로 null이므로 빈 문자열 (세 번째 질문) 또는 속성 이름 (첫 번째 질문)을 반환합니다. 두 번째 질문은 속성을 발견하기 위해 약간 변경되었지만 결과는 빈 문자열이기도합니다.

제발 도와 줄 수 있어요? 고마워요!

편집 : 여기

내가 속성 값 (별도 둘 다 일을) retreive을 사용하고 2 방법에 대한 코드입니다. 둘 다 꽤 비슷합니다. 첫 번째는 속성의 이름을 가진 문자열을 사용하고 다른 하나는 람바 식을 사용합니다.

private static string GetDisplayName(Type dataType, string fieldName) 
{ 
    DisplayAttribute attr; 
    attr = (DisplayAttribute)dataType.GetProperty(fieldName).GetCustomAttributes(typeof(DisplayAttribute), true).SingleOrDefault(); 

    if (attr == null) 
    { 
     MetadataTypeAttribute metadataType = (MetadataTypeAttribute)dataType.GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault(); 
     if (metadataType != null) 
     { 
      var property = metadataType.MetadataClassType.GetProperty(fieldName); 
      if (property != null) 
      { 
       attr = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), true).SingleOrDefault(); 
      } 
     } 
    } 
    return (attr != null) ? attr.Name : String.Empty; 
} 


private static string GetPropertyName<T>(Expression<Func<T>> expression) 
{ 
    MemberExpression propertyExpression = (MemberExpression)expression.Body; 
    MemberInfo propertyMember = propertyExpression.Member; 

    Object[] displayAttributes = propertyMember.GetCustomAttributes(typeof(DisplayAttribute), true); 
    if (displayAttributes != null && displayAttributes.Length == 1) 
     return ((DisplayAttribute)displayAttributes[0]).Name; 

    return propertyMember.Name; 
} 
+0

내가 내 대답을 삭제. 'Name' 속성을 검색하는 방법을 보여주는 코드를 게시 할 수 있습니까? –

+0

@Sergi Papaseit : ok, no problem;) 속성 값을 검색하는 데 사용하는 메서드 코드로 내 질문을 업데이트했습니다. 도와 주셔서 감사합니다! – jmpcm

답변

1

표시 이름을 리소스로 사용 하시겠습니까? 이 모든 반사 마법보다 훨씬 쉽게 재사용 할 수 있습니다.

[Display(Name = "Property1Name", ResourceType = typeof(Resources), Order = 1)] 
public Boolean Property1; 

을 그리고 Property1Name 키와 "속성 한 설명"값이 프로젝트에 Resources.resx 파일을 추가합니다

당신은 간단하게 할 수 있습니다. 물론 기본 리소스 액세스를 internal에서 public으로 설정해야 할 것입니다.

나중에 다른 곳에서 당신은 그 문자열은 단순히 전화를 필요 : 내가 잘못된 길을 당신을 이끌고 두려워하기 때문에

string displayName = Domain.Resources.Property1Name; 
관련 문제