2014-03-27 6 views
1

나는 화면에 몇백 가지 속성을 출력해야하는 프로젝트에서 작업 중입니다. 많은 지루한 마크 업을 절약하기 위해 리플렉션을 사용하기로 결정했습니다.모델 속성 리플렉션을 사용하여 표시 이름

//markup removed to keep this concise 
@for (var i = 0; i < Model.SiteAndJobDetails.GetType().GetProperties().Count(); i++) 
{ 
    @Model.SiteAndJobDetails.GetType().GetProperties()[i].Name 
    @Model.SiteAndJobDetails.GetType().GetProperties()[i].GetValue(Model.SiteAndJobDetails, null) 
} 

렌더링 속도가 느리지 만 HTML 도우미로 약 200 개의 속성 및 값을 쓸 수 없게됩니다. 적어도 그것은 계획이었습니다. 그러나 @Html.DisplayNameFor 또는 비슷한 속성을 사용하여 Display 속성 값을 가져와야합니다.

내 intial 생각은

@Html.DisplayNameFor(m=>@Model.SiteAndJobDetails.GetType().GetProperties()[i].Name) 

을했다하지만 내가 속성 이름을 얻기 위해 여기 반사를 사용하고 있기 때문에이 상상하는 것, 작동하지 않습니다. 다른 방법이 있습니까?

답변

1

@Andrei이 ViewData.ModelMetadata을 사용하는 것이 정확하지만 약간 떨어져 구문을했다.

: 올바른 구문은 그렇지 않은 경우, 또는 속성 이름
1

당신은이 메타 데이터를 사용하여 얻을 수 있습니다 (즉, 프레임 워크가 어쨌든 무엇의) :

string displayName = ViewData.ModelMetadata.Properties 
     .Where(x => x.PropertyName == Model.SiteAndJobDetails.GetType() 
            .GetProperties()[i].Name) 
     .SingleOrDefault() 
     .DisplayName; 
+0

올바른 방향으로 나를 안내해 주셔서 감사합니다. 귀하의 구문이 약간 떨어져서 나는 미래의 검색자를위한 대답을 편집 할 것입니다. 편집이 수락되면 동의 할 것입니다. 도와 주셔서 대단히 감사합니다. – James

+0

@James, 편집이 거부되었습니다. 솔루션을 원래 게시물의 답 또는 편집으로 추가하는 것을 고려하십시오. –

+1

괜찮습니다. 도움을 받으십시오. 고마워. – James

0

@if (!string.IsNullOrEmpty(@ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails").Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name).DisplayName)) 
{ 
    @ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails").Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name).DisplayName 
} 
else 
{ 
    @Model.SiteAndJobDetails.GetType().GetProperties()[i].Name 
} 
를 사용하여 면도날이 추가

@ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails") 
.Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name) 
.DisplayName 

최종 솔루션은 그것을 사용 않을 경우 속성이 존재를 확인하는 것입니다입니다 그런 다음

@functions { 
string R<TCLASS>(Expression<Func<TCLASS, Object>> expression) //Lambda = x => x.TPROPERTY 
{ 
    var memberExpression = expression.Body as MemberExpression; 
    if(memberExpression == null) 
    { 
     memberExpression = (MemberExpression) ((UnaryExpression)expression.Body).Operand; 
    } 

    return memberExpression.Member.Name; 
} 
} 

을 수행 할 수 있습니다

@(R<ModelClassName>(x => x.PropertyName)) //Outputs "PropertyName" 
,

JSON을 수신하는 자바 스크립트를 작성할 때 이것을 사용하는 것을 좋아합니다.

<script> 
    function recieveJsonResult(classNameDto) { 
     var classProperty = [email protected](R<ClassNameDto>(x => x.PropertyName)); 
    } 
</script> 

이 방법을 사용하면 람다 내부에서 자동 완성을 얻을 당신은 당신의 프론트 엔드 코드를 깨는에 대한 걱정없이 재산의 이름을 바꿀 무료 : 그것은 당신이이 작업을 수행 할 수 있습니다.

관련 문제