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.