MVC 3,NHIbernate Validators&消息插值器

时间:2011-03-08 20:20:13

标签: validation asp.net-mvc-3 nhibernate-validator

我已经关注this article并且通过了测试,显示当对Validator.IsValid(someEntity)的调用失败时,从资源文件返回自定义验证错误消息。

我试图将此转换为this article描述的MVC3中新的不引人注意的客户端验证。这或多或少都有效 - 客户端验证确实如此,我可以假设我的NHValidators接线很好,你可以看到输出如下:

<input data-val="true" data-val-required="{NotNullNotEmpty}" id="Username" name="Username" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="Username" data-valmsg-replace="true">

我的问题是,这次CustomMessageInterpolator没有触发 - 该属性尚未翻译资源字符串(它仍然是大括号):{NotNullNotEmpty}。

我的测试和网络都使用相同的NHValidator配置:

var cfg = new FluentConfiguration();
cfg
.SetMessageInterpolator<CustomMessageInterpolator>()
.SetCustomResourceManager("MyProject.Core.Resources.ValidationMessages", Assembly.Load("MyProject.Core"))
.SetDefaultValidatorMode(ValidatorMode.UseAttribute)
.Register(Assembly.Load("MyProject.Core").ValidationDefinitions())

这里有一个很好的衡量标准:

public class LoginModel
  {
    [NotNullNotEmpty(Message = "{NotNullNotEmpty}")]
    public string Username { get; set; }

远射我知道,但任何想法都会受到赞赏!

2 个答案:

答案 0 :(得分:0)

我在几个论坛上发布它并没有运气。

最后,我在我的View Models中使用DataAnnotations进行客户端验证。

当然,这实际上是hacky和一个可怕的“解决方案”,因为我现在在我的代码中有两种类型的验证属性。 (如果想知道,是的,我宁愿保留我的NH Validation属性1.因为我仍然从他们生成我的模式和2.我喜欢NH在提交到数据库之前验证的方式,即服务器端)。

如果有兴趣,可以在how to use resource files显示控件的正确标签。

此代码段显示了如何设置自定义错误消息:

  [DisplayResource(typeof(LabelResources))]
  public class NewChildTagViewModel : ModuleViewModel
  {
    public int ParentId { get; set; }

    [Required]
    public string Title { get; set; }

    [Range(1, 1000, ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = "Display_Order")]
    [Required]
    public int? DisplayOrder { get; set; }
  }

答案 1 :(得分:0)

你能展示你的代码吗?我认为您使用了某种自定义ModelValidatorProvider

我的工作就像你描述的那样。它需要按照此处描述的行编写自定义AssociatedValidatorProviderModelValidator

http://weblogs.asp.net/srkirkland/archive/2010/07/20/nhibernate-client-validator-asp-net-mvc-2-model-validation.aspx

但是更改上面文章中的MessageOrDefault方法以使用NHibernate Validator DefaultMessageInterpolator来翻译消息。

听起来你已经完成了大部分工作,而你只需要使用DefaultMessageInterpolator翻译消息。