1

현재 2 언어를 지원해야하는 MVC4 응용 프로그램에서 작업하고 있습니다. 나는 형태로 자원을 DataAnnotations을 사용하고 있습니다 : 내가 존재하는 경우 언어 쿠키를 읽는 글로벌 액션 필터을 만든culture 변경 후 유효성 검사 오류 메시지가 변경되지 않습니다.

public class SignupModel 
{ 
    [Required(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))] 
    [Email(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))] 
    public string Email { get; set; } 

    [Required(ErrorMessageResourceName = "Registration_PasswordRequired", ErrorMessageResourceType = typeof(Validation))] 
    [StringLength(100, MinimumLength = 8, ErrorMessageResourceName = "Registration_PasswordInvalidLength", ErrorMessageResourceType = typeof(Validation))] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 
} 

, 이에 따라 현재 문화uiculture을 설정 . 쿠키가 존재하지 않으면 현재 문화권의 쿠키가 생성됩니다. 예상대로

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext); 
    var culture = new CultureInfo(langCookie.Value); 

    Thread.CurrentThread.CurrentCulture = culture; 
    Thread.CurrentThread.CurrentUICulture = culture; 
} 

모든 것이 이러한 상황이 발생하는 경우를 제외하고 작동합니다 :

  1. 후 HTML 양식에서 (의 홈과의 멋진 가입 양식을 가정 해 봅시다 이것은 OnActionExecuting는 필터에 같은 모습입니다 클라이언트 측 유효성 검사가 없으므로 멋진 레이아웃에서는 아무 것도 작동하지 않습니다.) 홈 컨트롤러의 Signup 동작.
  2. 게시 된 데이터에 오류가있는 경우 현재 문화권과 일치하는 언어로 표시됩니다. (좋고 예상 된).
  3. 실제로 서버에 다시 게시하는 클라이언트에서 활성화 된 드롭 다운을 사용하여 언어를 변경하십시오. (나는 아직 PRG을 구현하지 않았기 때문에 동일한 데이터가 다시 게시된다는 경고를 볼 수 있습니다.)
  4. 뷰는 내가 선택한 언어로 렌더링되지만 유효성 검사 메시지는 원래 동일한 언어로 유지됩니다.

언어 스위치를 처리하는 동작 필터를 디버깅하는 경우 오류가 원래 언어로 유지되는 것을 볼 수 있으므로 서버에서 한 번만 내 유효성 검사가 수행됩니다. ModelState를 제거하고 유효성 검사를 수행해야한다고 생각합니다. 그러나이 문제를 해결할 더 좋은 방법이 있다면 해킹인지 궁금합니다.

감사합니다. 여기 R.

답변

1

읽기 숀 쑤의 게시물 : http://geekswithblogs.net/shaunxu/archive/2010/05/06/localization-in-asp.net-mvc-ndash-3-days-investigation-1-day.aspx

합니다 (유효성 검사 메시지의 획득에 대한 책임)에 ModelBinder를가 actionfilters 조치들 앞에서 실행하고 문화 변화가 전에 일어나는 그 이유는 유효성 검증 메시지 텍스트가 판별되고 영향을받지 않습니다.

이 코드를 컨트롤러의 Execute 또는 ControllerFactory의 CreateController 메서드와 같은 이전 확장 점으로 옮길 수 있습니다.

여기 제안 된 솔루션에 대한 내 질문을 볼 수 있습니다. How to control the language in which model validation errors are displayed