流利的验证不适用于长度

Bre*_*ogt 5 asp.net-mvc fluentvalidation asp.net-mvc-3

我试图让Fluent验证在我的客户端验证上正常工作.我正在使用ASP.NET MVC 3.

我有一个必需的标题,它必须在1到100个字符之间.因此,当我输入标题时,会显示一条错误消息,该消息不在我的规则集中.这是我的规则集:

RuleFor(x => x.Title)
   .NotEmpty()
   .WithMessage("Title is required")
   .Length(1, 100)
   .WithMessage("Title must be less than or equal to 100 characters");
Run Code Online (Sandbox Code Playgroud)

以下是显示的错误消息:

Please enter a value less than or equal to 100
Run Code Online (Sandbox Code Playgroud)

我不确定我做错了什么.这是我的global.asax:

// FluentValidation
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(
   new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
   new AttributedValidatorFactory());
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 12

对我来说很好.以下是步骤:

  1. 使用默认的Visual Studio模板创建一个新的ASP.NET MVC 3 RTM项目
  2. 下载最新的FluentValidation.NET
  3. 引用FluentValidation.dllFluentValidation.Mvc.dll程序集(注意.zip中有两个文件夹:MVC2和MVC3,所以一定要选择合适的程序集)

添加模型:

[Validator(typeof(MyViewModelValidator))]
public class MyViewModel
{
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和相应的验证器:

public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
    public MyViewModelValidator()
    {
        RuleFor(x => x.Title)
           .NotEmpty()
           .WithMessage("Title is required")
           .Length(1, 5)
           .WithMessage("Title must be less than or equal to 5 characters");
    }
}
Run Code Online (Sandbox Code Playgroud)

添加到Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
    new AttributedValidatorFactory());
Run Code Online (Sandbox Code Playgroud)

添加控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的观点:

@model SomeApp.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.Title)
    @Html.ValidationMessageFor(x => x.Title)
    <input type="submit" value="OK" />
}
Run Code Online (Sandbox Code Playgroud)

现在尝试提交表单,留下标题输入empty =>客户端验证踢,并显示标题是必需的消息.现在开始键入一些文本=>错误消息消失.在输入框中键入超过5个字符后,标题必须小于或等于5个字符,才会显示验证消息.所以一切似乎都按预期工作.

  • @Brendan,这就是为什么在提出问题时你应尽可能详细地提供有关你的场景的详细信息.如果这些细节是源代码形式,那就更好了.当我回答问题时,我总是尝试提供完整的工作源代码,以便人们可以轻松地在他们的机器上重现行为.它还允许我快速测试和模拟事物. (6认同)