MVC CheckBox За причиняване на заобикаляне на ненатрапчиво валидиране

Имам формуляр, съдържащ редица контроли - нищо особено:

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <fieldset>
        <legend>EmployeeViewModel</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Employee.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Employee.Title)
etc.....

АКТУАЛИЗИРАНЕ Моят ViewModel:

public class EmployeeCreateViewModel
    {
        public EmployeeCreateModel Employee { get; set; }
..etc

Моят модел на служител:

public class EmployeeCreateModel
    {
        [Required]
        public string Title { get; set; }

        [DisplayName("Job Title")]
        [Required]
        public string JobTitle { get; set; }

        public bool Active { get; set; }
...etc

Проблемът - Използвам ненатрапчива проверка, която работи добре, ДОКАТО не добавя квадратче за отметка към формуляра. Независимо от състоянието на квадратчето за отметка, формулярът се изпраща, като се заобикаля валидирането от страна на клиента и грешките се улавят от валидирането от страната на сървъра. Това е моето квадратче за отметка:

<div class="editor-label">
   @Html.LabelFor(model => model.Employee.Active)
</div>
<div class="editor-field">
   @Html.CheckBoxFor(model => model.Employee.Active)
</div>

Свойството на модела на полето за отметка не е задължително поле, така че не е необходимо да се проверява и мога да видя, че има валидна стойност True/False, когато достигне метода на контролера.

Защо се случва това и как мога да го поправя?


person markpsmith    schedule 11.10.2013    source източник
comment
Значи не искате да пише false в контролера, ако не е отметнато?   -  person Andrew    schedule 11.10.2013
comment
@Andrew - стойността, предадена на контролера, Е невярна, ако не е маркирана   -  person markpsmith    schedule 11.10.2013
comment
@markpsmith какви грешки се улавят от валидирането от страна на сървъра? Само защото квадратчето за отметка има стойност, когато не е отметнато, не означава, че е валидирано. Точно така работят квадратчетата за отметка в MVC. Bool трябва да е True или False, така че когато не е отметнато, False е правилно.   -  person Andrew    schedule 11.10.2013
comment
@Andrew - квадратчето за отметка НЕ ​​е една от грешките, уловени от страна на сървъра, но така или иначе не се интересувам от валидирането му.   -  person markpsmith    schedule 11.10.2013
comment
Мога ли само да поясня - казвате, че когато добавите квадратчето за отметка към формуляра, всички валидации от страна на клиента за целия формуляр се заобикалят и когато премахнете квадратчето за отметка, валидирането от страна на клиента работи отново?   -  person ED-209    schedule 11.10.2013
comment
@whoshotjr - така е. Валидирането от страна на клиента се показва за секунда, докато формулярът е публикуван, след това страницата се опреснява и се показва валидирането от страна на сървъра   -  person markpsmith    schedule 11.10.2013
comment
Изглежда, че и други са имали подобен проблем. Този въпрос няма отговори: stackoverflow.com/questions/18415655/   -  person ED-209    schedule 11.10.2013
comment
@whoshotjr - добра находка. Отговорих на този въпрос с моето решение, но все пак бих искал да открия причината за проблема.   -  person markpsmith    schedule 11.10.2013
comment
Намерихте и друг - можете да отговорите и на него! stackoverflow.com/questions/18391025/   -  person ED-209    schedule 11.10.2013
comment
@whoshotjr - това просто би било алчно! Вместо това публикувах връзка в коментарите. наздраве.   -  person markpsmith    schedule 11.10.2013
comment
Същият проблем тук. Забелязах, че по подразбиране той добавя атрибутите data-val-required и data-val към квадратчето за отметка по подразбиране. Когато те са там, проблемите, които описвате, се случват. Когато ги премахна с помощта на инспектора, формулярът се валидира по желание. В обобщение, изглежда, че CheckBoxFor автоматично добавя необходимите атрибути.   -  person tjans    schedule 25.08.2016


Отговори (1)


Първо отворете конзолата на javascript (напр. панел за инспектор на chrome) и вижте дали получавате грешка Uncaught TypeError: Object [object Object] has no method 'live' от jquery.unobtrusive-ajax.js.

Ако виждате тази грешка, вероятно използвате jquery 1.9.x или по-нова версия. Ако поставите отметка на „Запазване на регистрационния файл при навигация“ (chrome), можете да видите грешка „Uncaught SyntaxError: Unexpected token u“.

За да разрешите този проблем, включете jquery migrate 1.2.x след jquery 1.9.x.

<script src="/Scripts/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script>

За подробности вижте тази публикация.

person jpark7ca    schedule 13.11.2013