【发布时间】: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