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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

MVC5 использует jquery.validate

http://jqueryvalidation.org/rules/

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

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

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

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

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

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

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

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

Edit:

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

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

Ответ 4

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

Ответ 5

Для достижения этой цели в данном сценарии нам нужно сделать две настройки.

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

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

@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);

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