【问题标题】:ValidationResult Returned From IValidatableObject.Validate Is Not Localized从 IValidatableObject.Validate 返回的 ValidationResult 未本地化
【发布时间】:2011-11-06 00:10:09
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc-3 localization ivalidatableobject


    【解决方案1】:

    似乎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();
              }
        }
      

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 2013-12-23
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2018-04-12
        相关资源
        最近更新 更多