Проверка на стороне клиента ASP.NET MVC 2 не работает, как объявлено в VS2010 - PullRequest
1 голос
/ 12 мая 2010

В VS2010 и ASP.NET MVC 2 кажется, что проверка на стороне клиента (JQuery Futures или опцион на акции) не совсем работает так, как рекламируется.

Я замечаю, что "добавление" проверенного элемента не вызовет проверку на стороне клиента, как и было обещано. Для обязательного поля необходимо ввести вкладку в элемент, ввести что-то, а затем полностью удалить его, чтобы активировать требуемую проверку. Это не совсем то, что мне нужно здесь, и я надеюсь, что это просто проблема конфигурации на моей стороне.

Как получить эффекты проверки от предыдущих версий, чтобы не требовалось предыдущее значение (без необходимости изменять сценарии на стороне клиента, если это возможно)?

Для тех, кто спрашивал здесь, это пример того, что я делаю на стороне клиента.

 <div>
    <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm("Signup", "Home", new { area = "Admin" }, FormMethod.Post, new { id = "create_account_form", action = "#" })) { %>
        <fieldset>
            <div>
                <table>
                     <tr>
                        <td><label for="Email"> Email</label></td>
                        <td><%= Html.TextBoxFor(m => m.Email, new { name = "Email", @class = "textfield" }) %></td>
                        <td colspan="2"><p class="hint"><%= Html.ValidationMessageFor(m => m.Email)%></p></td>
                    </tr>
                    <tr>
                        <td><label for="Company"> Company</label></td>
                        <td><%= Html.TextBoxFor(m => m.Company, new { name = "Company", @class = "textfield" })%></td>
                        <td colspan="2"><p class="hint"><%= Html.ValidationMessageFor(m => m.Company)%></p></td>
                    </tr>
                </table>
            </div>
        </fieldset>
    <% } %>     

Ответы [ 4 ]

2 голосов
/ 13 мая 2010

Я могу подтвердить, что он работает, когда «вставляет» элемент, но это похоже на проблему с определенными типами проверочных аннотаций.

Похоже, что если у вас есть атрибут [Required], проверка не будет запущена, если вы просто tab введете соответствующий ввод.

Если у вас есть [RegularExpression], то это срабатывает, когда вы выходите.

Я подозреваю, что проверка запускается комбинацией событий onechange и blur. Это объясняет, почему регулярное выражение может быть проверено (как оно изменилось), но не является обязательным тестом.

Это мой вид модели:

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a first name")]
    [StringLength(50, ErrorMessage = "Maximum of 50 characters")]
    public string FirstName { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a last name")]
    [StringLength(50, ErrorMessage = "Maximum of 50 characters")]
    public string LastName { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a unique email address")]
    [CustomValidation(typeof(User), "ValidateUniqueEmailAddress")]
    [StringLength(255, ErrorMessage = "Maximum of 255 characters")]
    [RegularExpression(EmailRegEx, ErrorMessage = "Invalid email address entered")]
    public string EmailAddress { get; set; }

и HTML-код.

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
   {%>
<%: Html.ValidationSummary(true) %>
<fieldset class="colLeft">
    <legend>Required Fields</legend>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.FirstName) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.FirstName) %>
        <%: Html.ValidationMessageFor(model => model.FirstName) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.LastName) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.LastName) %>
        <%: Html.ValidationMessageFor(model => model.LastName) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.EmailAddress) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.EmailAddress) %>
        <%: Html.ValidationMessageFor(model => model.EmailAddress) %>
    </div>

Как видите, ничего сложного.

В этом случае, когда вы просматриваете все входные данные (имя, фамилия, адрес электронной почты), проверка [Required] не запускается ни на одном из них. Если вы введете неверный адрес электронной почты, а затем перейдете на вкладку, будет запущена проверка [RegularExpression].

Похоже, ошибка / особенность одной из библиотек валидации.

ПРИМЕЧАНИЕ. Я протестировал это в VS 2010, поскольку у меня нет доступа к VS 2008, но я не вижу, как это будет отличаться в двух версиях, поскольку код между ними точно такой же. Я также использовал Google Chrome.

0 голосов
/ 13 января 2013

Может быть, вы используете проверенные версии проверки?

Как в моем случае. В режиме отладки проверка на стороне клиента работала, а в версии выпуска - нет. Я использовал метод комплектации файлов. Bunndle автоматически - в версии релиза он включает минимизированные версии (если мини-файлы в проекте), и потому что ссылки на файлы благодарят пример "* .validate.min.js", он не работает.

Но минимизированные версии - это не плохо.

Разрешение: Используйте ссылки на файлы валидации без суффикса ".min".

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

Вы можете удалить не свернутые версии файлов, а затем свернутые версии удалить суффикс ".min". пример: "jquery.validate.min.js" --rename-> "jquery.validate.js" и используйте эту ссылку (удалите файлы проверки с суффиксом ".min").

0 голосов
/ 12 мая 2010

Я полностью знаю, что вы имеете в виду, но на самом деле это не проблема в VS2010 или MVC2.

MVC2 использует jquery.validate в качестве механизма проверки, и это внешняя сторонняя библиотека. В этой библиотеке, если вы удалите вкладку из поля, которое является обязательным, пустым и в котором не было введено никаких данных с момента загрузки страницы - она ​​не уведомит вас немедленно. Если у вас есть «числовой» валидатор, и вы вводите строку - он сразу идентифицируется.

Хорошая вещь - когда вы нажимаете Submit (или просто Enter на КБ), он пытается отправить форму, проверить все поля на стороне клиента, увидеть, что некоторые обязательные поля не заполнены, и будет показать подтверждение на них! Так что никакой запрос на сервер не будет отправлен, это точно!

P.S. Я не уверен на 100%, но я думаю, что это может быть даже не ошибка jquery.validate. Насколько я помню, событие blur js работает только в том случае, если вы изменили значение в поле, но я могу здесь сильно ошибиться. И если это так - то это не вина структуры валидации или VS вообще:)

0 голосов
/ 12 мая 2010

У вас есть это <% Html.EnableClientValidation(); %> вверху вашей страницы?

Если вы это делаете, и это все еще не работает, то не могли бы вы опубликовать код.

РЕДАКТИРОВАТЬ

Вы включили;

<script type="text/javascript" src="/scripts/jquery.validate.js"></script>
<script type="text/javascript" src="/scripts/MicrosoftMvcJQueryValidation.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...