ASP .NET MVC вимкнути перевірку на стороні клієнта на рівні кожного поля


74

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

Чи є спосіб позначити, що певне поле (або певна анотація даних) має бути перевірено лише на стороні сервера?

У мене є поле телефонного номера з маскуючим плагіном, і валідатор регулярних виразів божеволіє від кінця користувача. Регулярний вираз є лише безпечним для роботи (на випадок, якщо хтось вирішить зламати перевірку javascript), тому мені він не потрібен для роботи на стороні клієнта. Але я все одно хотів би, щоб інша перевірка працювала на стороні клієнта.

Відповіді:


103

Я не впевнений, чи працює це рішення на 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
Приємно, за винятком того, що перевірка включається, навіть якщо вона була вимкнена для початку.
Ian Warburton

4
Звичайно, це можна вдосконалити!
Лоренцо Мелато

Я змусив його працювати в дещо складнішій ситуації, щоб видалити індивідуальну перевірку, якщо поле має кілька валідаторів, з’ясувавши, які атрибути даних додає конкретний постачальник перевірки, і встановивши для них порожній рядок. Поки що це працює. Дякую за пропозицію.
stephenbayer

Це дуже хороше рішення через те, що сторінка завантажує менше тексту у джерелі. Це помітно покращило час завантаження за рахунок непотрібного тексту перевірки.
lloyd

92

Ви можете вимкнути ненав’язливу перевірку на стороні клієнта для одного поля, додавши 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)


Якщо я не ставлю підкреслення, IIS дає мені виняток. Повідомлення про помилку компілятора: CS0746: Недійсний декларатор анонімного типу. Анонімні члени типу повинні бути оголошені з призначенням члена, простим іменем або доступом члена.
csharpforevermore

2
Це спрацювало як шарм і є найчистішим рішенням цієї проблеми, яку я ще знайшов.
Джон Саллі,

3
Це чудово працює і є найчистішим рішенням. Дякую!
Патрік

3
@Data_val не відображає "data-val" у MVC 5.
Soppus

Це працює так: @ Html.EditorFor (model => model.Phone2, new {htmlAttributes = new {data_val_number = "Must be numeric"}})
xeshu

19

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

7

Припускаючи, що ви використовуєте ненав’язливу перевірку за замовчуванням, ви можете використати якийсь javascript для видалення правил на стороні клієнта. Погляньте на модулі / перевірка / правила


4

Для досягнення цієї мети в даному сценарії нам потрібно зробити дві зміни.

Сторона клієнта

Щоб вимкнути перевірку на стороні клієнта, нам потрібно відключити її примусово.

@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

Я зіткнувся з проблемами з data_val = "true". У моїй моделі була послідовність перемикачів, прив’язаних до одного властивості. Перевірка даних працювала лише тоді, коли я застосував data_val = "true" до першого виклику @ 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

Якщо ви хочете видалити перевірки на стороні клієнта MVC5, вам потрібно зробити наступне:

$("#Email").rules("remove", {
                        "required",
                        "minlength",
                        "email"                           
                        }
                    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.