0

我已经按照这篇文章进行了通过测试,显示了当调用 Validator.IsValid(someEntity) 失败时从资源文件返回的自定义验证错误消息。

我试图将其转换为本文描述的 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; }

我知道远射,但任何想法将不胜感激!

4

2 回答 2

0

我在一些论坛上发布了它,但我对此并不走运。

最后,我在我的视图模型中使用了 DataAnnotations 来进行客户端验证。

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

如果有兴趣,这里是如何使用资源文件为控件显示正确标签的方法。

此代码片段显示了如何随后也装配自定义错误消息:

  [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; }
  }
于 2011-03-10T11:34:24.443 回答
0

你能显示你的代码吗?我想你使用了某种自定义ModelValidatorProvider

我有一些像你描述的那样工作的东西。它需要按照此处描述的方式编写自定义AssociatedValidatorProviderModelValidator

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

但是将上面文章中的 MessageOrDefault 方法更改为使用 NHibernate ValidatorDefaultMessageInterpolator来翻译消息。

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

于 2011-03-10T20:04:40.757 回答