2014-07-21 2 views
0

프로퍼티의 표시 이름을 프로그래밍 방식으로 재정의 할 수 있기를 원합니다.오버라이드 모델보기 모델 이름

표시 이름이 정의 된보기 모델이 있습니다.

[Display(Name = "Reference")] 
    public string Reference { get; set; } 

문자열 재정의 매개 변수를 사용하는 LabelFor() 확장에 대한 오버로드를 만들었습니다. 이런 식으로 호출

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, string applicationVariableOverride) 
{ 
    if (applicationVariableOverride != null) 
     return new MvcHtmlString(applicationVariableOverride); 
    else 
     return System.Web.Mvc.Html.LabelExtensions.LabelFor<TModel, TValue>(htmlHelper, expression); 
} 

... :

@Html.LabelFor(x => x.Reference, "New Reference Display Name") 

이 어떤 메시지에 따라 라벨 잘 작동하지만 텍스트가 설정되는 이러한 속성을 사용하여 유효성 검사 메시지에 대해 작동하지 않습니다 동적 표시되고 있습니다. 대신이 함수에서 속성의 표시 이름을 전달 (또는 설정)하고 싶습니다.

속성에 직접 액세스하고 해당 속성 (표시 이름) 중 하나에 액세스하려고합니까 아니면 더 간단한 방법이 있습니까?

감사

답변

1

당신은 전체 오류 메시지를 무시할 수 있습니다. 오류 메시지 (속성 표시 이름)의 일부만 바꾸려면 이미 너무 늦었습니다. 이 오류 메시지는 ValidationAttribute을 통해 ModelState (예 :보기가 시작되기 전)으로 설정됩니다. 당신이 할 수있는 일

// error is already in the collection 
string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); 
ModelErrorCollection errors = htmlHelper.ViewData.ModelState[fullHtmlFieldName].Errors; 

는 해킹 -

[Display(Name = "$myplaceholder$")] 
public string Reference { get; set; } 

같은 몇 가지 이상한 키워드로 그리고 당신의 방법

var oldMessage = System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor<TModel, TProperty>(htmlHelper, expression); 
var newMessage = oldMessage.ToString().Replace("$myplaceholder$", applicationVariableOverride); 
return new MvcHtmlString(newMessage); 

그러나 전반적으로는 XY 문제 냄새에 당신의 재산을 장식 - 질문은 대신 DisplayNameAttribute을 덮어 쓰지 않으시겠습니까?

+0

답장을 보내 주셔서 감사합니다. 나는 이것이 표시 이름을 설정하는 논리적 인/정확한 장소가 될 것이므로 속성을 오버라이드하고 싶습니다. 그러나 그것은 상수가 아닌 어떤 것도 통과시키지 않을 것입니다 ... – Beakie