2015-09-24 2 views
0

Использование MVC4 с FluentValidation. У меня есть поле с двумя правилами. Правило NotEmpty работает так, как ожидалось. Правило совпадений, похоже, срабатывает, но форма все равно сохраняется, даже несмотря на то, что сообщение о проверке всплывает, как будто оно не проходит проверку.Появляется сообщение FluentValidation, но форма отправляется в любом случае

У меня есть следующая модель представления и валидатор:

public class ImpactedEntityViewModelValidator : AbstractValidator<ImpactedEntityViewModel> 
{ 
    public ImpactedEntityViewModelValidator() 
    { 
     RuleFor(x => x.ImpactedEntityDescription) 
      .Matches("[a-zA-Z0-9/ ]{1,}").WithMessage("Description can only contain letters, numbers, '/', and spaces.") 
      .NotEmpty().WithMessage("Description is required."); 
    } 
} 

[Validator(typeof(ImpactedEntityViewModelValidator))] 
public class ImpactedEntityViewModel 
{ 
    public int? ImpactedEntityLUID { get; set; } 

    [Display(Name = "Impacted Entity Description")] 
    public string ImpactedEntityDescription { get; set; } 

    public bool? Deleted { get; set; } 
} 

Вид:

@model ChangeControlForm.Models.ImpactedEntityViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    @Html.EditorFor(model => model) 

    <p> 
     <input type="submit" value="Create" class="btn btn-default" /> 
    </p> 
} 

Добавлен Global Application_Start:

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(); 

я не уверен, как это возможно. Он не будет отправлен, если поле осталось пустым, как и ожидалось. Например, если я укажу «%», появится сообщение для правила «Матчи», после чего оно будет немедленно отправляться после записи и записывать запись. Есть что-то, чего я не вижу, что может вызвать это?

спасибо. Ответ

Per Майкл Крук:

Это решало вопрос:

$("form").submit(function() { 
    var form = $(this); 
    if (form.valid()) { 
     // do valid stuff 
    } 
    else { 
     return false; 
    } 
}); 

ответ Per LeftyX в:

Проверены мои пакеты NuGet и JQuery было обновления доступны. Обновление до 2.1.4 исправило проблему, и мне не нужна дополнительная проверка на отправку.

Спасибо всем.

ответ

2

Вы действительно не должны делать проверку для проверки себя:

$("form").submit(function() { 
    var form = $(this); 
    if (form.valid()) { 
     // do valid stuff 
    } 
    else { 
     return false; 
    } 
}); 

Я имею в виду, вы можете, но, вероятно, вы, вероятно, уже есть все, что нужно на месте.

Если вы проверяете в вашей папке сценариев вы должны иметь:

jquery.validate.js 
jquery.validate.unobtrusive.js 

и

jquery.unobtrusive-ajax.js (this is only needed if you're POSTing ajax) 

и вы BundleConfig уже связывает скрипты, необходимые для клиентской стороны проверки:

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
    "~/Scripts/jquery.unobtrusive*", 
    "~/Scripts/jquery.validate*")); 

шаблон по умолчанию не добавляет ссылку на автоматический пучок чески, но вы можете добавить его просто добавив:

@Scripts.Render("~/bundles/jqueryval") 

к вашему _Layout.cshtml или там, где вам нужно валидацию на стороне клиента.

если вы проверите HTML для вашей формы вы увидите, что ваш вход:

<input name="ImpactedEntityDescription" class="text-box single-line" id="ImpactedEntityDescription" type="text" value="" data-val="true" data-val-required="Description is required." data-val-regex-pattern="[a-zA-Z0-9/ ]{1,}" data-val-regex="Description can only contain letters, numbers, '/', and spaces."> 

есть все ненавязчивые атрибуты устанавливаются на месте:

data-val="true" 
data-val-required="Description is required." 
data-val-regex-pattern="[a-zA-Z0-9/ ]{1,}" 
data-val-regex="Description can only contain letters, numbers, '/', and spaces." 

jquery.validate.js проверяет форму Перед sumitting для вас (строка 404):

// http://jqueryvalidation.org/Validator.form/ 
form: function() { 
    this.checkForm(); 
    $.extend(this.submitted, this.errorMap); 
    this.invalid = $.extend({}, this.errorMap); 
    if (!this.valid()) { 
     $(this.currentForm).triggerHandler("invalid-form", [ this ]); 
    } 
    this.showErrors(); 
    return this.valid(); 
}, 

Проверьте Обновлены пакеты nuget.

+0

Хороший звонок. Я обновил jQuery, и теперь мне не нужна дополнительная проверка для отправки. Спасибо за предложение !!! – Mike

+0

Рад, что я помог Майку. Приветствия. – LeftyX

1

Возможно, вы обнаружите, что FluentValidation (я использовал только для проверки на стороне сервера, а не на стороне клиента) не имеет возможности отключить проводку. Вы можете попробовать использовать jquery для поиска формы для классов ошибок проверки, а затем самостоятельно отключить кнопку.

+0

Правда, это может быть легко обходным путем. Благодаря! Странно, но мне никогда не приходилось делать это раньше на MVC3 с Fluent. Это мой первый проект с использованием 4. * shrug * – Mike

+0

попробуйте изменить to . вам может потребоваться указать действие для публикации в форме начала HTML, если вы это сделаете, но –

0

Помимо возможных причин, упомянутых уже выше, эта линия на ваш взгляд, может также привести к отправке формы, как только пользователь нажимает вашу кнопку отправки, даже если форма по-прежнему недействителен:

HtmlHelper.ClientValidationEnabled = false; 
Смежные вопросы