2015-09-08 4 views
0

Я видел много примеров использования 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]) 
} 

ответ

0

Im не конечно, почему вы изменили бы его на клиентов? Не все проверки должны выполняться клиентами. Возможно, вы можете заставить его работать с использованием метода проверки регулярных выражений вместо метода Must, который выполняется клиентами по документам.

+0

Кажется довольно стандартным, что в любое время можно избежать вызова сервера. Если что-то может быть сделано на стороне клиента, тогда это нужно сделать. В этом случае я использую HTML-тег FILE. без клиентской стороны, если я откажу серверную часть, и мое представление будет возвращено. Элемент FILE имеет ошибку, но фактический элемент пуст, так как установка элемента FILE программно запрещена. Не только я делаю вызов сервера, который не нужен, но затем совершенно неясно, что вызвало ошибку, так как я не могу показать данные. –

+0

Я получаю вашу мысль. Возможно, эта ссылка может дать вам дополнительную информацию. http://fluentvalidation.codeplex.com/discussions/351248 Также я думаю, что наткнулся на сообщение в блоге J Skinner, которое дает немного больше информации, но я не могу найти его прямо сейчас. Вы заглянули в метод «Матчи», который может выполнять проверку правильности регулярных выражений? Я все еще думаю, что это ваш лучший выбор. – Flodpanter

Смежные вопросы