ValidationResult, возвращенный из IValidatableObject.Validate не локализован - PullRequest
2 голосов
/ 29 августа 2011

На моем сайте 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, всегда соответствует культуре по умолчанию.

Есть ли способ правильно локализовать сообщения IValidatableObject.Validate?

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Похоже, что метод IValidatableObject.Validate вызывается до того, как культура станет доступной для системы. Если метод Validate вызывается вручную из действия контроллера, сообщения об ошибках локализуются правильно.

Используя вариант перечисленного метода здесь , я могу получить локализованные сообщения об ошибках в представлении, очистив 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 голосов
/ 30 августа 2011

Где вы устанавливаете культуру? Я установил его в Controller> ExecuteCore, и он работает как положено.

, например

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

            base.ExecuteCore();
        }
  }
...