0

У меня есть пара зависимых полей - состояние и zipcode, а также контроллер api, который проверяет, что почтовый индекс отображается в состоянии. Я могу вызвать изменение в выпадающем списке State, чтобы снова проверить почтовый индекс, но потом, если я изменил выбор, проверка не произойдет!jQuery validate проверяет только один раз при изменении опции выбора

Часть страницы, что имеет важное значение:

@Html.LabelFor(model => model.State, new { @class = "control-label col-md-1" }) 
<div class="col-md-2"> 
    @Html.DropDownListFor(model => model.State, Model.StateSelections, new { htmlAttributes = new { @class = "form-control" } }) 
    @Html.ValidationMessageFor(model => model.State, "", new { @class = "text-danger" }) 
</div> 

@Html.LabelFor(model => model.Zip, new { @class = "col-md-1 control-label" }) 
<div class="col-md-2"> 
    @Html.EditorFor(model => model.Zip, new { htmlAttributes = new { @class = "form-control" } }) 
    @Html.ValidationMessageFor(model => model.Zip, "", new { @class = "text-danger" }) 
</div> 

JQuery:

$(document).ready(function() { 

    $("#@Html.IdFor(model => model.State)").on("change", function() { 
     $("#@Html.IdFor(model => model.Zip)").valid(); 
    }); 


    $("#@Html.IdFor(model => model.Zip)").rules("add", { 
     "remote": { 
      url: zipcodeApiUrl, 
      type: "GET", 
      data: { 
       stateAbbreviation: function() { 
        //alert('I validate, but only the first time'); 
        return $("#@Html.IdFor(model => model.State)").val(); 
       } 
      } 
     } 
    }); 
}); 

Здесь оказали код:

var stateId = '#State'; 
var zipcodeId = '#Zip'; 
$(document).ready(function() { 

    $(stateId).on("change", function() { 
     $(zipcodeId).valid(); 
    }); 


    $(zipcodeId).rules("add", { 
     "remote": { 
      url: zipcodeApiUrl, 
      type: "GET", 
      data: { 
       stateAbbreviation: function() { 
        return $(stateId).val(); 
       } 
      } 
     } 
    }); 

}); 

(надрез)

<label class="control-label col-md-1" for="State">State</label> 
<div class="col-md-2"> 
    <select data-val="true" data-val-required="The State field is required." htmlAttributes="{ class = form-control }" id="State" name="State"> 
     <option value="AK">AK - ALASKA</option> 
     <option value="AL">AL - ALABAMA</option> 
     <option value="AP">AP - ARMED FORCES PACIFIC</option> 
     (...) 
     <option value="WI">WI - WISCONSIN</option> 
     <option value="WV">WV - WEST VIRGINIA</option> 
     <option value="WY">WY - WYOMING</option> 
     </select> 
    <span class="field-validation-valid text-danger" data-valmsg-for="State" data-valmsg-replace="true"></span> 
</div> 

<label class="col-md-1 control-label" for="Zip">Zip</label> 
<div class="col-md-2"> 
    <input class="form-control text-box single-line" data-val="true" data-val-length="The field Zip must be a string with a maximum length of 5." data-val-length-max="5" data-val-regex="Zip code must be a 5 digit number" data-val-regex-pattern="\d{1,5}" data-val-required="The Zip field is required." id="Zip" name="Zip" type="text" value="11735" /> 
    <span class="field-validation-valid text-danger" data-valmsg-for="Zip" data-valmsg-replace="true"></span> 
</div> 

Редактирование: Как ни странно, если я удалю символ в поле zipcode, проверка начнет работать до тех пор, пока я не взаимодействую с выпадающим списком. Может быть, есть атрибут данных, который нужно изменить, чтобы снова вызвать его?

Попытка выяснить, почему valid() работает только один раз.

+0

Пожалуйста, только покажите нам *** визуализированный *** HTML и JavaScript, как об этом заботится обозреватель. Как только проблема root будет идентифицирована, вы можете при необходимости изменить свой серверный код. – Sparky

+0

Очевидно, обработчик 'change' будет срабатывать при каждом изменении' select'. Не имеет никакого смысла. – Sparky

+0

Обработчик изменений срабатывает каждый раз, но правила этого не делают. –

ответ

0

Я выкопал довольно далеко и нашел точную точку отсчета, которая вызывала проблему и отправлялась на репо. Похоже, что это на самом деле предназначено для этого!

http://github.com/jzaefferer/jquery-validation/issues/1567

Я получил запрос тянуть слиты в Jquery-Validate, которая исправляет эту ошибку!

+0

Я могу понять мнение разработчика об этом. В большинстве случаев не нужно было бы снова называть 'remote', если значение поля не изменилось. Очевидно, вам нехорошо. – Sparky

+0

Да, я тоже. Единственный альтернативный ответ, который я придумал, заключался в проверке ON '# zip' с точки зрения' # state', что кажется странным, потому что валидация должна происходить с точки зрения проверяемого поля (imo). Не говоря уже о том, что ошибка появлялась в неправильном поле, но я мог просто переместить сообщение о проверке там (но это даже странно ...) –

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