2010-12-06 4 views
2

안녕하세요!기본값을 변경하십시오. "{0} 필드가 필요합니다"(궁극적 인 해결 방법)

나는 로그인 양식에 사용하는 다음 뷰 모델 클래스했습니다 Global.asax

using System.ComponentModel.DataAnnotations; 

... 

public class UserLogin : IDataErrorInfo 
{   
    [Required] 
    [DisplayName("Login")] 
    public string Login { get; set; } 

    [Required] 
    [DisplayName("Password")] 
    public string Password { get; set; } 

    [DisplayName("Remember Me")] 
    public bool RememberMe { get; set; } 

    #region IDataErrorInfo Members 

    // This will be a Model-level error 
    public string Error 
    { 
     get 
     { 
      if (!WebUser.CanLogin(Login, Password)) 
      { 
       return Resources.ValidationErrors.InvalidLoginPassword; 
      } 
      else 
      { 
       return String.Empty; 
      } 
     } 
    } 

    // All is handled by DataAnnotation attributes, just a stub for interface 
    public string this[string columnName] 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 
    #endregion 

} 

그리고이 :

DefaultModelBinder.ResourceClassKey = "BinderMessages"; 
ValidationExtensions.ResourceClassKey = "BinderMessages"; 

리소스 파일 BinderMessages.resx 내부 배치 (이 두 개의 키 InvalidPropertyValue있다 App_GlobalResources한다 어떤 작품) 및 PropertyValueRequired하지 않으며 나를 기본 메시지를 제공합니다.

질문 :이 메시지를 수정할 수 있습니까, 아니면 DataAnnotations에 연결되어 있습니까?

나는 이것에 대해 많은 게시물을 찾았지만 해결책은 찾지 못했습니다. 지금은 그냥이에 폴백 (fallback) :

[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")] 
+0

문제가 있지만 왼쪽으로, 당신은 로그인과 암호를 비워두면 무엇인가? 프로그램이 설정되지 않은 개체로 중단됩니다. – Fandango68

+0

왜 그렇게 생각하니? 모델 바인더는 어쨌든'UserLogin' 객체 인스턴스를 인스턴스화합니다. – artvolk

+0

거의 5 년이며 아직 적용되지 않는 것으로 보입니다. 'global.asax'에 정의 된 리소스 파일에서 사용할 수있는 키는 여전히 4 개뿐입니다. – mcy

답변

6

는 사용자 지정 RequiredAttribute를 확장하고이 값을 설정 ValidationAttribute을 만들 수 있습니다. 다음과 같이하십시오 :

public class MyRequiredAttribute : RequiredAttribute 
{ 
    public MyRequiredAttribute() 
    { 
     ErrorMessageResourceType = typeof(Resources.ValidationErrors); 
     ErrorMessageResourceName = "Required"; 
    } 
} 

다음 사용자 정의 속성으로 모델을 꾸미십시오.

기본 메시지는 리소스 파일의 DataAnnotations 어셈블리에 System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources 아래에 컴파일되고 RequiredAttribute_ValidationError=The {0} field is required.입니다. 질문에 대답하기 위해, 그 메시지는 DataAnnotations의 일부입니다.

편집 : PropertyValueRequired은 null이 허용되지 않는 유형의 오류 값에 사용됩니다. 아래에 언급 된대로 PropertyValueInvalid은 유형 변환 오류에 사용됩니다.

+0

응답 해 주셔서 감사합니다. 내 것보다 훨씬 좋은 해결책입니다 ('ActionFilterAttribute'를 사용하고 데이터 주석 attriube가 아닙니까?). . 왜 그것이 작동하지 않는지 알 수 있습니까? – artvolk

+0

죄송합니다. 미안합니다. 나는 ValidationAttribute를 의미했습니다. 편집 됨. – bmancini

+0

작은 메모 :'InvalidPropertyValue'는 객체 필드 (변환 오류)에 값을 바인딩하지 못하는 경우에 호출됩니다. 예를 들어 문자열 값을 int 모델 필드에 바인딩 할 수없는 경우 유효성 검사 전에 발생합니다. – artvolk

1

번역을 제공하기 위해 싱글 톤 클래스를 사용하는 접근 방식을 수행했습니다. @bmancini가 제안한대로 모든 속성을 유도해야합니다. 나의 접근 방식의 장점은 다른 로직을 수정할 필요없이 다중 문자열 테이블을 사용할 수 있다는 것입니다. 내 블로그 항목 오히려 크기 때문에

, 나는 그냥 링크를 제공합니다 : http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/

관련 문제