2014-09-03 3 views
4

Моя форма, которую я проектирую с MVC 4, имеет mutiple DIVS со многими элементами в каждом из них. Моя цель - открыть/закрыть DIVS, когда пользователь заполнит поля. Тем не менее, я хочу использовать ненавязчивую проверку на каждом DIV, а не на всю форму. Это возможно без проверки каждого элемента отдельно? Может быть, использовать идентификатор DIV или что-то еще? Я не хочу создавать эту массивную функцию для проверки каждого элемента в каждом DIV, чтобы пользователь мог перейти к следующему DIV.MVC Синтаксис проверки jQuery для группы элементов

Я пытаюсь это, и это не работает:

var elems = []; 
var valid = true; 
("#Contact").find('.text_input').each(function() { 
    elems.push(this.id); 
    } 
    for (var i = 0; i<= elems.length; i++) { 
     if ($("#" + elems[i]) != undefined) { 
      $("#form1").validate().element("#" + elems[i])) 
      if ($("#" + elems[i]).valid()) { 
      } 
      else { 
      valid = false; 
      } 
     } 
    } 

, но я получаю сообщение об ошибке неопределенной. Элементы в DIV, которые имеют класс text_input, являются те, которые необходимы для проверки.

+0

Когда вы проверяете элементы в пределах DIV? Например, когда последний элемент в div теряет фокус или когда вы нажимаете кнопку, чтобы показать следующий div? –

+1

В этом случае, когда пользователь нажимает кнопку Далее, который вызывает функцию, чтобы скрыть первый div и показать вторую. Но я хочу проверить элементы в этом первом div, прежде чем показывать второй? Имеет ли это смысл? –

ответ

6

Вы можете проверить отдельные элементы управления с помощью Validator.element(element) - see documentation here, так что вы можете использовать следующий подход (вы не отправили мнение HTML поэтому не может писать фактический код для вас)

В следующем нажатии кнопки событие

  1. Выберите все элементы управления в пределах связаны div - например var controls = $(this).closest('div').find('input, textarea, select');
  2. В $.each петле, вызовите $("form").validate().element($(this));
  3. При необходимости, испытание, если действующий с $(this).valid();
  4. Если все действительно, скрыть текущий ДИВ и отобразить следующий

Редактировать (например, добавлены)

View

<div class="section"> 
    <h2>Section 1</h2> 
    .... // Your inputs and validation 
    @Html.LabelFor(m => m.SomeProperty) 
    @Html.TextBoxFor(m => m.SomeProperty) 
    @Html.ValidationMessageFor(m => m.SomeProperty) 
    <div class="error"></div> 
    <button type="button" class="next">Next</button> 
</div> 
<div class="section"> 
    <h2>Section 2</h2> 
    .... // Your inputs and validation 
    <div class="error"></div> 
    <button type="button" class="next">Next</button> 
</div> 
<div class="section"> 
    <h2>Section 3</h2> 
    .... // Your inputs and validation 
    <div class="error"></div> 
    <button type="submit" class="next">Submit</button> // submit button for last section 
</div> 

CSS

.section:not(:first-of-type) { 
    display:none; 
} 

Script

$('button').click(function() { 
    var container = $(this).closest('.section'); 
    var isValid = true;  
    $.each(container.find('input'), function() { 
    $('form').validate().element($(this)); 
    if (!$(this).valid()) { 
     isValid = false; 
     return false; 
    } 
    }); 
    if (isValid) { 
    container.next('.section').show().find('input').first().focus(); 
    container.hide(); 
    } else { 
    container.find('.error').text('please complete'); 
    } 
}); 
+0

Проверьте мои изменения и дайте мне знать, почему это не работает. –

+0

Нет причин помещать его в массив. После 'var controls = ...' then '$ .each (control, function (index, item) {$ (" # form1 "). Validate(). Element ($ (this));' - или может потребоваться чтобы быть '..element ($ (this) [0]);' - не уверен без тестирования –

+0

Не могли бы вы выписать функцию для меня? –