2011-08-29 14 views
2

在我的ASP.NET MVC3的網站,我使用下面的視圖模型:的ValidationResult返回了IValidatableObject.Validate未本地化

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方法返回的消息始終處於默認文化。

有沒有辦法正確定位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

在哪裏你設置文化?我將它設置在Controller> ExecuteCore中,並按預期工作。

例如

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

      base.ExecuteCore(); 
     } 
    }