【问题标题】:Client Side Validation Using Custom Validator FluentValidation MVC使用自定义验证器 FluentValidation MVC 进行客户端验证
【发布时间】:2015-12-04 13:24:24
【问题描述】:

我在这里看到了很多使用 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);
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 似乎很标准,任何时候都应该避免服务器调用。如果可以在客户端完成某些事情,那么它应该完成。在本例中,我使用的是 FILE HTML 标记。没有客户端,如果我在服务器端失败并且我的视图被返回。 FILE 元素有错误,但实际元素为空白,因为禁止以编程方式设置 FILE 元素。我不仅进行了不必要的服务器调用,而且由于我无法显示数据,因此完全不清楚导致错误的原因。
    • 我明白你的意思。也许此链接可以为您提供更多信息。 fluentvalidation.codeplex.com/discussions/351248 另外,我想我偶然发现了 J SKinner 的一篇博客文章,它确实提供了更多信息,但我现在找不到。您是否研究过可以在客户端执行正则表达式验证的 Matches 方法?我仍然认为这是你最好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多