【问题标题】:FluentValidation not working on form submit when JavaScript is disabled禁用 JavaScript 时,FluentValidation 无法处理表单提交
【发布时间】:2014-11-05 10:45:17
【问题描述】:

我正在使用FluentValidation 来验证模型。我设置如下:

型号

public class UserViewModel {
    public String Email { get; set; }
    public String PhoneNumber { get; set; }
    public String FullName { get; set; }
    public String CompanyName { get; set; }
}

验证类

public class UserViewModelValidation: AbstractValidator<UserViewModel> {
    public UserViewModelValidation() {
        RuleFor(x => x.Email).NotNull().WithLocalizedMessage(() => ValidationResources.EmailRequired);
        RuleFor(x => x.Email).EmailAddress().WithLocalizedMessage(() => ValidationResources.EmailValid);
        RuleFor(x => x.PhoneNumber).NotNull().WithLocalizedMessage(() => ValidationResources.PhoneNumberRequired);
        RuleFor(x => x.FullName).NotNull().WithLocalizedMessage(() => ValidationResources.FullNameRequired);
        RuleFor(x => x.CompanyName).NotNull().WithLocalizedMessage(() => ValidationResources.CompanyNameRequired);
    }
}

在 Global.asax 中注册

FluentValidationModelValidatorProvider.Configure();

控制器

[HttpPost]
public ActionResult UpdateUser(UserViewModel vm) {
    if (!ModelState.IsValid)
        return View(vm);

    var service = DiConfig.Resolve<IUserService>();
    service.Update(vm);
    return RedirectToAction("Index");
}

查看

<form action="@Url.Action("UpdateUser", "User")">
    @Html.ValidationSummary(true)
    <div class="form-input">
        @Html.LabelFor(m => m.Email, FormResources.Email)
        @Html.TextBoxFor(m => m.Email)
        <div class="error-message">@Html.ValidationMessageFor(m => m.Email)</div>
    </div>
    <div class="form-input">
        @Html.LabelFor(m => m.PhoneNumber, FormResources.PhoneNumber)
        @Html.TextBoxFor(m => m.PhoneNumber)
        <div class="error-message">@Html.ValidationMessageFor(m => m.PhoneNumber)</div>
    </div>
    <div class="form-input">
        @Html.LabelFor(m => m.FullName, FormResources.FullName)
        @Html.TextBoxFor(m => m.FullName)
        <div class="error-message">@Html.ValidationMessageFor(m => m.FullName)</div>
    </div>
    <div class="form-input">
        @Html.LabelFor(m => m.CompanyName, FormResources.CompanyName)
        @Html.TextBoxFor(m => m.CompanyName)
        <div class="error-message">@Html.ValidationMessageFor(m => m.CompanyName)</div>
    </div>
    <div class="form-input">
        <input type="submit" value="@FormResources.UpdateButton">
    </div>
</form>

问题

客户端验证完美运行。这里没有问题。但是,我试图确保即使在浏览器上禁用 JS 时验证也能正常工作。我的预期是在提交表单时在页面重新加载后看到错误消息,而无需客户端验证。

但是,结果是 - 根本没有验证消息,而在 URL 中只有query string params 带有提交的值。

问题

如何在禁用 JavaScript 时进行验证?我需要的是(当验证失败时)在帖子和页面重新加载后显示验证消息。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 validation fluentvalidation


    【解决方案1】:

    您可能错过了告诉 MVC 为特定类运行验证器的部分。 According to the docs,你可以通过装饰模型类来做到这一点:

    [Validator(typeof(UserViewModelValidation))]
    public class UserViewModel {
        public String Email { get; set; }
        public String PhoneNumber { get; set; }
        public String FullName { get; set; }
        public String CompanyName { get; set; }
    }
    

    ...或者通过配置一个ValidatorFactory:

    FluentValidationModelValidatorProvider.Configure(provider => {
      provider.ValidatorFactory = new MyCustomValidatorFactory();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多