2012-04-25 3 views
8

Required 특성을 사용하여 모델 개체의 속성을 장식하고 ErrorMessage 또는 ResourceType/Name을 지정하지 않으면 "{0} 필드가 필요합니다."라는 보완 형식의 유효성 검사 메시지가 나타납니다. 여기서 param 0은 해당 속성의 DisplayName 속성MVC3 : 일반 [필수] 유효성 확인 메시지 텍스트를 변경하는 방법?

기본 문자열을 다른 것으로 변경하고 싶지만 모델 개체의 모든 속성에 대해 ErrorMessage 또는 ResourceType/Name을 지정하고 싶지 않습니다. 기본 문자열은 어디에 저장되며 어떻게 변경할 수 있습니까?

답변

6

자신의 속성이 공정 옵션이며 아마 시작하는 가장 낮은 오버 헤드가 도출,하지만 당신은 돌아가서 [Required]의 모든 기존의 용도를 변경해야합니다 :이 작업을해야합니다. 당신 (그리고 당신 팀의 다른 사람들)도 앞으로 올바른 사람을 사용하는 것을 기억하고 (그리고 새로운 사람들을 가르쳐야 함) 기억해야 할 것입니다.

대체 방법은 ModelMetadataProvidersModelValidatorProviders을 리소스 파일의 문자열을 반환하는 것입니다. 이렇게하면 위의 단점을 피할 수 있습니다. 또한 메시지를 다른 속성 (예 : MaxLengthAttribute)으로 바꾸고 추가 언어를 지원하기위한 토대를 마련합니다.

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

여기서 전체 source, documentation이며, blog post는 사용을 설명.

6

RequiredAttribute의 파생 클래스를 만들고 FormatErrorMessage 메서드를 재정의하려 했습니까?

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

네, DisplayName 정의가 이미 필요하기 때문에 (명시 적으로 전달하는 대신) 'MyRequiredAttribute' 생성자에서'DisplayName' 메타 데이터 속성을 읽어야합니다. –

+1

아래 링크에 따르면 'name'매개 변수는 형식이 지정된 메시지에 포함될 이름입니다. //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage. aspx – Joshua