2

在我的 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消息?

4

2 回答 2

3

似乎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);
    }
于 2011-08-29T14:08:09.740 回答
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();
        }
  }
于 2011-08-29T21:21:11.473 回答