it-swarm.com.ru

ASP .NET MVC отключить проверку на стороне клиента на уровне поля

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

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

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

67
Ryan

Я не уверен, что это решение работает на 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>

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

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

98
Lorenzo Melato

Вы можете отключить ненавязчивую проверку на стороне клиента для одного поля, добавив атрибут 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)

79
Ross McNab

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

http://jqueryvalidation.org/rules/

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

Удалить все проверки на «myinput»

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

Конкретные проверки

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

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

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

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

Правка:

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

$("#myinput").attr('disabled', disabledValue);
18
Guish

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

7
archil

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

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

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

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

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

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

Когда модель проверяется в действии post, 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.

4
The Angry Coder

У меня возникли проблемы с 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" }
1
Peter Henry

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

$("#Email").rules("remove", {
                        "required",
                        "minlength",
                        "email"                           
                        }
                    });
0
Mantu