【问题标题】:Fluent Validation not working on length流利的验证不适用于长度
【发布时间】:2011-01-17 13:59:48
【问题描述】:

我正在尝试让 Fluent Validation 在我的客户端验证中正常工作。我正在使用 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");

这是显示的错误消息:

Please enter a value less than or equal to 100

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

// FluentValidation
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
   new AttributedValidatorFactory());

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 fluentvalidation


    【解决方案1】:

    对我来说很好用。步骤如下:

    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; }
    }
    

    和相应的验证器:

    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");
        }
    }
    

    添加到Application_Start:

    DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
    
    ModelValidatorProviders.Providers.Clear();
    ModelValidatorProviders.Providers.Add(
        new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));
    
    ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
        new AttributedValidatorFactory());
    

    添加控制器:

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

    以及对应的视图:

    @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" />
    }
    

    现在尝试提交表单,将 Title 输入留空 => 客户端验证启动并显示 Title is required 消息。现在开始输入一些文本 => 错误消息消失。在输入框中键入超过 5 个字符后,标题必须小于或等于 5 个字符 验证消息就会出现。所以一切似乎都按预期工作。

    【讨论】:

    • 谢谢达林。我拥有它,就像你拥有它一样。在 Jeremy Skinner(FluentValidation 的)的帮助下,我发现了错误。在我的文本框中,我将 maxlength 属性设置为 max。这错误地触发了 Jquery 验证触发器。
    • @Brendan,这就是为什么在提问时您应该尽可能多地提供有关您的场景的详细信息。如果这些细节在源代码形式下会更好。当我回答问题时,我总是尝试提供完整的工作源代码,以便人们可以轻松地在他们的机器上重现行为。它还允许我快速测试和模拟事物。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多