使用自定义验证器FluentValidation MVC

时间:2015-09-08 18:35:22

标签: asp.net-mvc validation client-side fluentvalidation

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

Global - 这里的许多示例都显示了一个更复杂的配置

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

Collection Validator - 这应检查文件是否有效扩展

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])
}

1 个答案:

答案 0 :(得分:0)

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