2011-08-29 2 views
2

현지화되지 않음, 내가 사용하고있는 뷰 모델로 다음에 ValidationResult 반환이 내 ASP.NET의 MVC3 사이트에서

사이트가 기본 이외의 다른 문화를 사용하여 볼
using DataResources = Namespace.For.The.Localization.Resources.IndexViewModel; 

public class IndexViewModel, IValidatableObject { 

    private string _field1_check_value = "foo"; 
    private string _field2_check_value = "bar"; 

    [Required(ErrorMessageResourceName="Validation_Field1_Required", ErrorMessageResourceType=typeof(DataResources))] 
    [DataType(DataType.Text)] 
    public string Field1 { get; set; } 

    [Required(ErrorMessageResourceName="Validation_Field2_Required", ErrorMessageResourceType=typeof(DataResources))] 
    [DataType(DataType.Field2)] 
    public string Field2 { get; set; } 


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if (!(Field1.Equals(_field1_check_value) && Field2.Equals(_field2_check_value))) { 
      string[] memberNames = { "Field1", "Field2" }; 
      yield return new ValidationResult(DataResources.Validation_InvalidCredentials, memberNames); 
      } 
     } 
    } 

, Required 유효성 검사 메시지가 올바르게 현지화되었습니다. 그러나 Validate 메서드에서 반환 된 메시지는 항상 기본 culture에 있습니다.

IValidatableObject.Validate 메시지를 제대로 현지화하는 방법이 있습니까?

답변

2

문화권이 시스템에 제공되기 전에 IValidatableObject.Validate 메서드가 호출 된 것으로 보입니다. Validate 메서드가 컨트롤러 동작에서 수동으로 호출되면 오류 메시지가 올바르게 지역화됩니다. here 나열된 방법의 변형을 사용하여

, 다음과 같이 내가 ModelState을 삭제하고, 컨트롤러 액션에서 다시 실행하기 위해 검증을 강제로 뷰에 오류 메시지를 지역화받을 수 있습니다

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index(IndexViewModel viewModel) { 

    if (ModelState.IsValid) { 
     //Do Stuff 
     return RedirectToAction("Action", "Controller"); 
     } 
    else { 
     // The original validation did not properly localize error messages coming from IValidatableObject.Validate. 
     // Clearing the ModelState and forcing the validation at this point results in localized error messages. 
     ModelState.Clear(); 
     var errors = viewModel.Validate(new ValidationContext(viewModel, null, null)); 
     foreach (var error in errors) 
      foreach (var memberName in error.MemberNames) 
       ModelState.AddModelError(memberName, error.ErrorMessage); 
     } 

    return View("Index", viewModel); 
    } 
2

너 문화 설정? 컨트롤러> ExecuteCore에서 설정하고 예상대로 작동합니다.

public class BaseController : Controller 
    { 
     protected override void ExecuteCore() 
     { 
      Thread.CurrentThread.CurrentUICulture = "en-GB"; 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 

      base.ExecuteCore(); 
     } 
    } 
관련 문제