0

现在,它只是显示一个通用的

“首字母”不应为空。

以下规则的消息:

context.RulesFor(p => p.Initials).Required(p => p.Message("Initials are frikking required.")).Length(0, 8);

首字母属性在一个相当大的类型模型中声明ApplicantProfileModel : MappedViewModel<ApplicantProfile>为只是 plain public string Initials { get; set; },甚至没有显示名称属性,但即使我添加了显示名称,我也会遇到同样的问题。

Required在视图模型中没有留下任何属性。

控制器动作代码为:

[HttpGet]
public ActionResult Create()
{
    var applicant = _applicantService.BuildApplicantProfile();
    var model = new ApplicantProfileModel();
    model.MapFromEntity(applicant);
    return View(model);
}

这是我最后无数项目的标准代码,除了 FluentValidation 自定义消息外,一切正常。他们的验证很好。

观点是:

<li class="form-line">
    @Html.LabelFor(m => m.Initials)
    @Html.EditorFor(m => m.Initials)
    @Html.ValidationMessageFor(m => m.Initials)
</li>

我也试过TextBoxFor了,但没有区别。

4

2 回答 2

0

您是否在[Required]属性上留下了 DataAnnotation 属性?我发现如果保留它们,它们会显示而不是我的自定义验证规则。

编辑:这就是我过去设置验证器的方式 - 也可能是它们没有触发,因为您正在执行 aHttpGet而不是 aHttpPost并且您需要手动调用 Validate?

public class ApplicantProfileModelValidator : AbstractValidator<ApplicantProfileModel>
{
    public ApplicantProfileModelValidator()
    {
        RuleFor(r => r.Initials)
            .NotEmpty()
            .WithMessage("Initials are frikking required.");
    }
}
于 2013-01-21T08:20:15.717 回答
0

原来我混合了两个不同但非常相似的验证库。我最初是从ASP.NET MVC 流式验证框架开始的,或者在 NuGet 上称为FluentMVC。这需要您的模型实现一个名为 的方法InitializeModel(ModelContext<TModel> context),您可以在其中为各种属性添加规则,例如

context.RulesFor(p => p.Id).Required(p => p.Message("Id is missing. Message may have been tampered with.").StopOnFail());

验证引擎以某种方式在所有模型上调用此方法,因为尽管指示IModelInitializer<TModel>在您的验证模型上实现接口,但我没有。这并不是说正在注册规则,而是该库的某些部分处于活动状态并干扰了我正在尝试使用的库FluentValidation在 NuGet 上称为 FluentValidation、FluentValidation.MVC3 和 FluentValidation.MVC4。

从我的模型中移除方法后InitializeModel,事情似乎正在发挥作用。现在显示我用于验证的粗鲁测试消息,因此它们不会偷偷溜过测试和发布管理器。

于 2013-01-21T09:26:53.110 回答