使用自定义验证程序 FluentValidation MVC 进行客户端验证

Client Side Validation Using Custom Validator FluentValidation MVC

提问人:Shawn Doe 提问时间:9/9/2015 最后编辑:Shawn Doe 更新时间:9/10/2015 访问量:1483

问:

我在这里看到了很多使用 FluentValidation 的例子,但似乎没有一个符合我的需求。我有一个现有的服务器端实现,根据这里的答案,我确信我必须改变我的实现才能让它在客户端工作。一个原因是因为我无法设置客户端似乎需要的 ValidationType。我在转换代码时遇到问题,因此我也可以在客户端使用它。我正在提交文件对象列表,并希望客户端验证文件扩展名是否为.pdf或.doc。

全局 - 此处的许多示例显示了更复杂的配置

protected void Application_Start()
{
    FluentValidationModelValidatorProvider.Configure();
}

模型 - 我简化了我的模型,以显示我至少有一个属性和一个集合

[Validator(typeof(MyCustomValidator))]
public class MyCustomModel
{
    public DateTime SubmitDate { get; set; }
    public List<HttpPostedFileBase> MyFiles { get; set; }
}

模型验证器 - 我有一个单独的集合验证器

public class MyCustomModelValidator : AbstractValidator<MyCustomModel>
{
    public MyCustomModelValidator()
    {
        RuleFor(x => x.SubmitDate)
            .NotEmpty()
            .WithMessage("Date Required");           

        RuleFor(x => x.MyFiles)  
            .SetCollectionValidator(new MyFileValidator())
            .Where(x => x != null);
    }
}

集合验证程序 - 这应该检查文件是否有有效的扩展名

public class MyFileValidator : AbstractValidator<HttpPostedFileBase>
{
    public MyFileValidator()
    {
        RuleFor(x => x)              
           .Must(x => x.IsValidFileType())
           .WithMessage("Invalid File Type")
    }  
}

public static bool IsValidFileType(this HttpPostedFileBase file)
{
    var extensions = { ".pdf", ".doc" };

    return extensions.Contains(Path.GetExtension(file.FileName.ToLower()));
}

控制器 - 仅显示基础知识

[HttpGet]
public ActionResult Index(DefaultParameters parameters)
{
    var model = new MyCustomModel();

    return this.View(model);
}   

[HttpPost]
public ActionResult Submit(MyCustomModel model)
{   
    if (!ModelState.IsValid)
    {
        return this.View("Index", model);
    }   
}

查看 - 我允许每次提交 5 次上传

@Html.TextBoxFor(m => m.SubmitDate)
@Html.ValidationMessageFor(m => m.TextBoxFor

@for (int i = 0; i < 5; i++)
{
    @Html.TextBoxFor(m => m.FileSubmissions[i], new { type = "file" })
    @Html.ValidationMessageFor(m => m.FileSubmissions[i])
}
ASP.NET-MVC 验证 客户端 FluentValidation

评论


答:

0赞 Flodpanter 9/10/2015 #1

我不确定为什么要将其更改为客户端?并非所有验证都应在客户端运行。也许您可以使用正则表达式验证方法而不是根据文档在客户端执行的 Must 方法让它工作。

评论

0赞 Shawn Doe 9/10/2015
任何时候都可以避免服务器调用,这似乎是很标准的。如果某件事可以在客户端完成,那么就应该完成。在这种情况下,我使用的是 FILE HTML 标签。如果没有客户端,如果我在服务器端失败并且返回我的视图。FILE 元素有错误,但实际元素为空,因为禁止以编程方式设置 FILE 元素。我不仅进行了不必要的服务器调用,而且由于我无法显示数据,因此完全不清楚导致错误的原因。
0赞 Flodpanter 9/11/2015
我明白你的意思。也许这个链接可以给你进一步的信息。fluentvalidation.codeplex.com/discussions/351248另外,我想我偶然发现了 J SKinner 的一篇博文,它确实提供了更多信息,但我现在找不到它。您是否研究了可以在客户端执行正则表达式验证的 Matches-method?我仍然认为这是你最好的选择。