我在这里看到了许多使用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])
}
答案 0 :(得分:0)
我不确定您为什么要将其更改为客户端?并非所有验证都应该在客户端运行。也许你可以使用正则表达式验证方法,而不是根据文档在客户端执行的Must方法。