ASP.NET MVC отключает проверку на стороне клиента на уровне каждого поля
Я с помощью ASP .Чистый MVC 3 с помощью аннотаций данных и jQuery проверить плагин.
есть ли способ отметить, что определенное поле (или определенная аннотация данных) должно быть проверено только на стороне сервера?
У меня есть поле номера телефона с маскирующим плагином на нем, и валидатор регулярных выражений сходит с ума на конце пользователя. Регулярное выражение является только отказоустойчивым (в случае, если кто-то решит взломать проверку javascript), поэтому мне не нужно его запускать на стороне клиента. Но я все равно хотел бы, чтобы другая проверка выполнялась на стороне клиента.
7 ответов:
Я не уверен, что это решение работает на 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>
Если у кого есть лучшее решение, Пожалуйста, дайте мне знать!
надеюсь, что это поможет.
вы можете отключить ненавязчивую проверку на стороне клиента для одного поля, добавив :
@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)
MVC5 использовать jquery.проверить
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);
предполагая, что вы используете ненавязчивую проверку по умолчанию, вы можете использовать некоторые javascript для удаления правил на стороне клиента. Взгляните на Плагины / проверка / правила
для достижения этой цели в данном сценарии нам нужно сделать две настройки.
На Стороне Клиента
чтобы отключить проверку на стороне клиента, нам нужно отключить ее силой.
@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.
Если вы хотите удалить проверку на стороне клиента MVC5 вам нужно сделать следующее:
$("#Email").rules("remove", { "required", "minlength", "email" } });
У меня возникли проблемы с data_val="true". У меня была последовательность переключателей, привязанных к одному свойству в моей модели. Проверка данных работала только тогда, когда я применил data_val="true" к первый @ Html.Радиокнопка для вызова.
в отладки, я обнаружил, что вы также можете отключить или изменить отдельные правила на стороне клиента с помощью data_rule_??. Правила можно найти в jQuery validation документация.
для пример;
@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" }); @Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }
Comments