2013-07-26 3 views
4

Я использую MVC4 w/JQuery, и у меня есть форма, которую я создал с помощью @ Ajax.BeginForm. Он имеет обязательные поля (заданные на его модели представления). Я пытаюсь проверить форму до того, как она будет отправлена ​​обратно; однако, похоже, это не подтверждается.jquery validate always return true

Первоначально у меня была кнопка отправки, и она просто отправила форму. Я изменил кнопку отправки на обычную кнопку и попытался позвонить $ ('# formname'). Validate(), но он всегда возвращает true (даже требуемые поля не заполняются). Другие представления, кажется, работают нормально (которые не используют Ajax.BeginForm).

Я ссылаюсь на jquery, jquery-ui, jquery.validate, jquery.validate.unobtrusive и jquery.unobtrusive-ajax.

У кого-нибудь есть идеи/предложения, что мне не хватает?

изменить --------------------------------------------- ------------------------------

Ниже мой код (это внутри главной страницы, которая ссылается на сценарии jquery):

@model AimOnlineMRA.Models.Reports.DateRangeViewModel 

@using (Ajax.BeginForm("GetReport", "Reports", new AjaxOptions 
{ 
    UpdateTargetId = "report_pane", HttpMethod = "Post"}, new {@id="parameterForm"})) 
{ 
    @Html.AntiForgeryToken() 

<script type="text/javascript"> 
    $(document).ready(function() { 
     ApplyTheme(); 

     $('#btnYes').click(function() { 
      $('#RunSpecificDateRange').val('true'); 

      $('#yesNo').hide(); 
      $('#dateRangeForm').show(); 
     }); 

     $('#btnCancel').click(function() { 
      $('#report_pane').html('').hide(); 
     }); 

     $('#btnOk').click(function() { 
      //if ($('#parameterForm').valid()) { 
      // alert('valid'); 
      //} else { 
      // alert('invalid'); 
      //} 
     }); 

     $('#dateRangeForm').hide(); 

     $('#BeginDate').datepicker({ 
      showOn: 'button', 
      buttonText: 'Date Picker', 
      buttonImageOnly: true, 
      buttonImage: '@Url.Content("~/Content/Icons/calendar-icon.png")' 
     }); 

     $('#EndDate').datepicker({ 
      showOn: 'button', 
      buttonText: 'Date Picker', 
      buttonImageOnly: true, 
      buttonImage: '@Url.Content("~/Content/Icons/calendar-icon.png")' 
     }); 
    }); 
</script> 

<div class="margin-auto" style="width: 400px"> 

    <div id="yesNo"> 
     <span class="bold">Do you want to run this report for a specific date range?</span> 
     <br /><br /> 
     @Html.Button("Yes", "btnYes") 
     @Html.Button("No", "btnNo") 
    </div> 
    <div id="dateRangeForm"> 
     <span class="bold">Date Range</span> 
     <br /><br /> 
     <div class="left"> 
      <div class="left clear-both"> 
       @Html.LabelFor(x => x.BeginDate) <br /> 
       @Html.TextBoxFor(x => x.BeginDate, new {@style="vertical-align:top"}) 
       @Html.ValidationMessageFor(x => x.BeginDate) 
      </div> 
      <div class="left clear-both m-top-5"> 
       @Html.LabelFor(x => x.EndDate) <br /> 
       @Html.TextBoxFor(x => x.EndDate, new {@style="vertical-align:top"}) 
       @Html.ValidationMessageFor(x => x.EndDate) 
      </div> 
     </div> 
     <div class="left m-left-10"> 

     </div> 
     <div class="left clear-both m-top-10"> 
      @Html.Button("Ok", "btnOk") 
      @Html.Button("Cancel", "btnCancel") 
     </div> 
    </div> 
</div> 
} 

----------------- РЕЗОЛЮЦИЯ ----------------------- ------

вызова $.validator.unobtrusive.parse($('#parameterForm')); перед тем $('#parameterForm').valid(); исправили проблему

+3

Пожалуйста, пост некоторые соответствующий код, возможно, использовать jsfiddle.net – Tdelang

+0

Значит ли ваша модель имеет атрибут [Обязательный] в указанных полях? Создаете ли вы свои входы с помощью Razor HtmlHelpers? –

+0

Да, у меня есть [Обязательно] на vm, и я создал их с помощью помощника бритвы. это одно из обязательных полей, которое выводилось, когда я рассматриваю его в chrome. spyter

ответ

22

Попробуйте

$.validator.unobtrusive.parse($('#parameterForm'))

перед вызовом

$('#parameterForm').valid()

+1

Это не похоже работать для меня. Я все равно получаю возвращаемое значение true даже без данных в обязательных полях. Любая идея, почему это может произойти? – masterwok

+0

Я смутно понимаю, почему он работает. Отлично! Благодаря! –

+0

это сработало для меня. благодаря! –

1

Добавляли ли вы к тегу HTML <input> или <textarea>?

IE:

<input id="cemail" type="email" name="email" required/> 
+0

У меня есть атрибут [Обязательный] в форме viewmodel. Глядя на вывод html в браузере, у меня есть следующее (для одного из обязательных полей): spyter

8

Вопрос уже принятый ответ, но вот еще одна возможная причина для тех, кто считает, T его в будущем ...

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

<input type=text required name='blah' /> 

я потратил 2 часа выслеживая этот же вопрос, и я обнаружил, что если FIRST проверенный элемент в форме имеет атрибут name, тогда все работает так, как вы ожидали бы (то есть .valid() вернет false, если форма недействительна). Кажется, не имеет значения, имеют ли другие проверенные элементы атрибуты имени или нет.

В нормальных формах вам обязательно нужны атрибуты имен, потому что это то, что используется, когда данные передаются на сервер. Но в более современных средах, таких как те, которые используют Knockout, нет никаких причин иметь атрибут name для элементов ввода, потому что привязка данных работает, чтобы обновить вашу модель данных.

+1

Сохранено мне некоторое время :) Спасибо –

+0

Добавление атрибута 'name' помогло, но я все еще получал validator = true (jQuery Validation Plugin - v1.13.0). Поэтому я обошел это со следующим кодом: \t [code] var validator = $ ("# login-form"). Validate(); \t validator.form(); \t alert ("validator.numberOfInvalids() =" + validator.numberOfInvalids()); \t \t если (validator.numberOfInvalids() = 0!) \t { \t \t предупреждение ("проверка не удалась"); \t \t возвращение; \t} \t предупреждение («валидация прошла - продолжение»); [/ code] – Mark

+1

Вы должны понимать разницу между «ненавязчивым» и нормальным валидацией. – Dementic

-2

Я ссылается оба файла:

  • jquery.validate.js
  • jquery.validate.unobstrusive.js < - удалите эту ссылку!

удаление ссылок на jquery.validate.unobstrusive.js, установил ее для меня

надеюсь, что это помогает кто-то

+2

Эти сценарии вообще не конфликтуют. 'jquery.validate.js' требуется для работы' jquery.validate.unobtrusive.js'. Должно быть, это было где-то в другом месте. –

+0

Вы постоянно публикуете это везде. Это не ответ. – ps2goat

+0

этот помогите мне –