ASP .NET MVC отключить проверку на стороне клиента на уровне поля - PullRequest
68 голосов
/ 12 апреля 2011

Я использую ASP .NET MVC 3 с аннотациями данных и плагином проверки jQuery.

Есть ли способ отметить, что определенное поле (или определенная аннотация данных) должно проверяться только на стороне сервера?

У меня есть поле номера телефона с плагином для маскировки, и валидатор регулярных выражений сходит с ума на стороне пользователя.Регулярное выражение является только отказоустойчивым (в случае, если кто-то решит взломать проверку JavaScript), поэтому мне не нужно его запускать на стороне клиента.Но я все еще хотел бы, чтобы другая проверка выполнялась на стороне клиента.

Ответы [ 7 ]

99 голосов
/ 03 февраля 2013

Я не уверен, работает ли это решение на MVC3. Это наверняка работает на MVC4:

Можно просто отключить проверку на стороне клиента в представлении Razor до визуализации поля и повторно включить проверку на стороне клиента после визуализации поля.

Пример:

<div class="editor-field">
    @{ Html.EnableClientValidation(false); }
    @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    @{ Html.EnableClientValidation(true); }
</div>

Здесь мы отключаем проверку на стороне клиента для поля BatchId.

Также я разработал небольшой помощник для этого:

public static class YnnovaHtmlHelper
{
    public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html)
    {
        return new ClientSideValidationDisabler(html);
    }
}

public class ClientSideValidationDisabler : IDisposable
{
    private HtmlHelper _html;

    public ClientSideValidationDisabler(HtmlHelper html)
    {
        _html = html;
        _html.EnableClientValidation(false);
    }

    public void Dispose()
    {
        _html.EnableClientValidation(true);
        _html = null;
    }
}

Вы будете использовать его следующим образом:

<div class="editor-field">
    @using (Html.BeginDisableClientSideValidation()) {
        @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    }
</div>

Если у кого-то есть лучшие решения, пожалуйста, дайте мне знать!

Надеюсь, эта помощь.

83 голосов
/ 17 июня 2014

Вы можете отключить ненавязчивую проверку на стороне клиента для одного поля, добавив атрибут data-val='false':

@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })

Это переопределит атрибут data-val='true', который MVC добавляет из-за любых атрибутов System.ComponentModel.DataAnnotations. Элемент HTML все еще будет украшен другими атрибутами проверки (например, data-val-required), но они не будут иметь никакого эффекта.

( Обратите внимание на подчеркивание в data_val выше. MVC автоматически преобразует подчеркивания в дефисы в свойствах анонимного типа, поэтому data_val становится data-val при рендеринге HTML)

19 голосов
/ 17 декабря 2015

MVC5 использовать jquery.validate

http://jqueryvalidation.org/rules/

Если вы хотите удалить проверки в MVC5 на стороне клиента, вам необходимо сделать следующее:

Удалить все проверкиon 'myinput'

$("#myinput").rules("remove");

Специальные проверки

$("#myinput").rules("remove", "min max" );

Список проверок может помочь

$("#myinput").rules();

Тогда вам необходимо исправитьВаш код Позволяет вручную проверить вашу модель или по-другому, потому что ModelState.IsValid будет ложным.Затем можно использовать ModelState.Clear() и TryValidateModel.

Редактировать:

Отключение элемента управления также удаляет проверки.

$("#myinput").attr('disabled', disabledValue);
7 голосов
/ 12 апреля 2011

Если вы используете ненавязчивую проверку по умолчанию, вы можете использовать некоторый JavaScript для удаления правил на стороне клиента. Взгляните на Плагины / Валидация / Правила

4 голосов
/ 29 декабря 2015

Чтобы достичь этой цели в данном сценарии, нам нужно сделать две настройки.

на стороне клиента

Чтобы отключить проверку на стороне клиента, нам нужно отключить ее

@Html.EditorFor(model => model.Password, new { htmlAttributes = new {  @data_val = "false" , @class = "form-control"} })

Обратите внимание на @ data_val = «false».В этом поле будет отключена проверка.

Сторона сервера (в действии)

Когда модель проверяется в действии публикации, ModelState.IsValid всегда возвращает falseпотому что пароль не предоставлен.Здесь мы должны предоставить текущий пароль для модели и повторно подтвердить модель.

var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault();
if (String.IsNullOrEmpty(users_Info.Password))
{
  users_Info.Password = userObj.Password;
}
ModelState.Clear();
TryValidateModel(users_Info);

Позвольте мне объяснить, сначала мы получаем текущую информацию, сохраненную в базе данных, которую мы используем позже, чтобы присвоить текущей моделиесли пароль не указан.Последние две строки фактически сбрасывают ModelState для возврата обновленного результата в ModelState.IsValid.

1 голос
/ 19 сентября 2018

У меня возникли проблемы с data_val = "true".У меня была последовательность переключателей, привязанных к одному свойству в моей модели.Проверка данных работала только тогда, когда я применил data_val = "true" к вызову first @ Html.RadioButtonFor.

При отладке я обнаружил, что вы также можете отключить или изменить отдельные правилана стороне клиента с помощью data_rule _ ??.Правила можно найти в проверке jquery документация .

например;

@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" });
@Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }
0 голосов
/ 10 мая 2018

Если вы хотите удалить проверки в клиентской части MVC5, вам нужно сделать следующее:

$("#Email").rules("remove", {
                        "required",
                        "minlength",
                        "email"                           
                        }
                    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...