2011-03-24 4 views
2

(리소스 파일없이) 이것은 우리가 우리는 우리를 위해 모델 검증을 돌보는 DataAnnotations을 사용하려는 MVC 2.NET MVC : 지역화 RequiredAttribute

.NET에서 직면하고있는 문제는, 그것이 예정되어있는 것처럼. 우리가 가지고있는 유일한 문제는 표준 오류 메시지를 원하지 않는다는 것입니다 (우리 웹 사이트에 여러 언어가 있기 때문에).

사이트를 설치하는 방법은 모든 텍스트를 데이터베이스에서 가져 오는 것입니다. 따라서 데이터베이스에 오류 메시지가 표시되기를 바랍니다. 우리는 올바른 지역화 된 버전에 필요한 데이터베이스 검색을 수행하는 "번역()"방법을 추가 할 String 클래스에 확장을 썼다

public class LocalizedRequiredAttribute : RequiredAttribute 
{ 
    public string LocalizedErrorMessage 
    { 
     get 
     { 
      return ErrorMessage; 
     } 
     set 
     { 
      ErrorMessage = value.Translate(); 
     } 
    } 

} 

:

그래서 우리는이 같은 사용자 정의 RequiredAttribute를 썼다 .

우리는 다음과 같이 우리의 속성을 사용

[LocalizedRequired(LocalizedErrorMessage = "Naam is required")] 
public string Name {get; set; } 

이 있지만 한 번만 사용할 수 있습니다.

프랑스어로 사이트를 처음 방문하면 값을 입력해야한다는 프랑스어 오류 메시지가 나타납니다. 나중에 영어 사이트를 방문하면 영어 페이지에서 프랑스어 오류가 계속 표시됩니다. 세터는 한 번만 불리는 것 같습니다.

이 동작을 방지하고 유효성 검사가 실행될 때마다/모델에 값이 채워지는 경우 오류 메시지를 새로 고치려면 어떻게해야합니까?

도움을 주셔서 감사합니다.

답변

2

setter에서 getter로 .Translate()를 이동하면이 문제를 해결할 수 없습니까? 당신의 세터는 단 한 번만 호출된다는 것은 의미가 있습니다.

편집 : 나는 ErrorMessage가 가상 메시지 였다고 추측합니다.

유일한 옵션은 데이터베이스에서 값을 검색하는 리소스 클래스 (리소스 파일이 필요 없음)를 만드는 것일 수 있습니다. 당신은 예로부터 추론 할 수 있듯이

 
[Required(ErrorMesageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))] 
public string Name {get; set; } 

class ABCResourceClass{ 
    public static String FirstName{ 
    get{ 
     return Translate("FirstName"); 
    } 
    } 

} 

은, 주석 프레임 워크는 ErrorMessageResourceName에게 제공하는 문자열과 일치하는 이름을 가진 속성을 호출합니다.

많은 종류의 속성이있는 경우 ABCResourceClass를 생성하기 위해 어떤 종류의 코드 생성 기술을 사용할 수 있습니다.

+0

은 (디버깅 테스트 hackish입니다 응용 프로그램). 그것은 직접 "ErrorMessage"RequiredAttribute 클래스에서 호출 같아요. –

+0

Aah. 나는 ErrorMessage가 가상 일 것으로 예상했다. 그렇지 않다는 것이 밝혀졌습니다. 리소스 파일없이 리소스 클래스 만 사용할 수 있습니다. 내가 outa 공간을 실행하는 중 직접 답변을 편집 중입니다. – Naraen

3

그냥 ErrorMessage 재산

을 설정하는 방법 FormatErrorMessage()을 (whis가 매번 호출)를 사용하지만, 그것은 것 때문에 게터가 호출되지 않습니다처럼 작동하지 않습니다

public class ErrorLocalizedRequiredAttribute : RequiredAttribute 
{ 
    public ErrorLocalizedRequiredAttribute(string name) 
    { 
     Name = name; 
    } 

    public string Name 
    { get; set; } 

    public override string FormatErrorMessage(string name) 
    { 
     //get translation from DB by Name 
     ErrorMessage = Localization.Translate(Name); 
     return base.FormatErrorMessage(name); 
    } 
} 
. 
. 
. 
[ErrorLocalizedRequiredAttribute("EmailIsRequired")] 
public string Email 
{ 
    get; set; 
}