Я видел много примеров использования FluentValidation здесь, но ни один из них не подходит мне. У меня есть существующая реализация на стороне сервера и на основе ответов здесь, я убежден, что мне нужно изменить свою реализацию, чтобы заставить ее работать на стороне клиента. Одна из причин заключается в том, что я не могу установить ValidationType, который кажется необходимым для клиентской стороны. У меня возникли проблемы с преобразованием кода, поэтому я могу использовать его и на стороне клиента. Я отправляю список объектов File и хочу, чтобы проверки на стороне клиента были расширениями .pdf или .doc.Проверка на стороне клиента с использованием пользовательского Validator FluentValidation MVC
Global - Многие примеры здесь показывают гораздо более сложной Configure
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);
}
}
Коллекционирование п 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()));
}
Controller - Просто показывая основы
[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);
}
}
View - Я позволяю 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])
}
Кажется довольно стандартным, что в любое время можно избежать вызова сервера. Если что-то может быть сделано на стороне клиента, тогда это нужно сделать. В этом случае я использую HTML-тег FILE. без клиентской стороны, если я откажу серверную часть, и мое представление будет возвращено. Элемент FILE имеет ошибку, но фактический элемент пуст, так как установка элемента FILE программно запрещена. Не только я делаю вызов сервера, который не нужен, но затем совершенно неясно, что вызвало ошибку, так как я не могу показать данные. –
Я получаю вашу мысль. Возможно, эта ссылка может дать вам дополнительную информацию. http://fluentvalidation.codeplex.com/discussions/351248 Также я думаю, что наткнулся на сообщение в блоге J Skinner, которое дает немного больше информации, но я не могу найти его прямо сейчас. Вы заглянули в метод «Матчи», который может выполнять проверку правильности регулярных выражений? Я все еще думаю, что это ваш лучший выбор. – Flodpanter