Почему проверка не работает с Html.TextBoxFor, а при использовании Html.EditorFor?
Я пробую атрибуты типа данных MVC и только что создал простой сценарий, подобный следующему:
Вид:
@model MVC4.Models.Model
@{
ViewBag.Title = "DataTypeAttribute";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<h2>DataTypeAttribute</h2>
@using (Html.BeginForm("SubmitData", "Home"))
{
<div>
@Html.ValidationSummary()
</div>
@Html.EditorFor(m => m.Email)
<br />
<br />
@Html.EditorFor(m => m.PostalCode)
<br />
<br />
@Html.EditorFor(m => m.TextOnly)
<br />
<br />
<button type="submit">Submit</button>
}
Модель:
public class Model
{
[DataType(DataType.EmailAddress)]
[Required]
//[EmailAddress]
public string Email { get; set; }
[DataType(DataType.PostalCode)]
public string PostalCode { get; set; }
public string TextOnly { get; set; }
}
"SubmitData" - это просто контроллер, который возвращает View(..., model), если ModelState.IsValid имеет значение false.
Хотя подобные сообщения хорошо справляются с разницей между Html.TextBoxFor и Html.EditorFor, я не смог найти ответа на вопрос, почему проверка для типа данных EmailAddress не будет работать при использовании TextBoxFor. Я обнаружил, что люди, упоминающие TextBoxFor, не учитывают метаданные, а EditorFor.
Но имеет ли это смысл? Так что TextBoxFor не предлагает поддержку проверок клиентов?!
Интересно, в чем причина разницы между ними?
1 ответ
TextBoxFor()
работает с проверками.
[DataType(DataType.EmailAddress)]
не является атрибутом проверки. Это атрибут, который определяет тип ввода для отображения путем установки type
атрибут в отображаемом HTML. Например <input type="text" ..>
, <input type="date" ..>
, <input type="email" ..>
для отображения в браузере реализации средства выбора даты HTML4, ввода электронной почты и т. д. Это работает только для EditorFor()
так как TextBoxFor()
как следует из названия, генерирует и вводит с type="text"
Если вы хотите проверить адрес электронной почты, используйте [EmailAddress]
атрибут на вашей собственности.
[Required]
[EmailAddress]
public string Email { get; set; }
Изменить (далее к комментариям)
Одной из особенностей HTML5 является возможность проверки пользовательских данных без использования сценариев. Одной из таких форм проверки браузера является использование type
приписывать. Использование [DataType(DataType.EmailAddress)]
на имущество, которое предоставляется с @Html.EditorFor()
добавляет type="email"
к input
элемент. Из документации MDN
email: элемент представляет один адрес электронной почты. Разрывы строк автоматически удаляются из входного значения. Неверный адрес электронной почты может быть установлен, но поле ввода будет удовлетворять его ограничениям только в том случае, если адрес электронной почты удовлетворяет производственной ABNF 1*( atext / ".") "@" Ldh-str 1*( "." Ldh-str) где atext определен в разделе 3.2.3 RFC 5322, а ldh-str определен в разделе 3.5 RFC 1034.
Если в данный момент вы видите сообщение об ошибке проверки, связанное со свойством, и вы не добавили [EmailAddress]
атрибут, то это означает, что jquery.validate.js
не загружен, и вы видите сообщение об ошибке браузера, связанное с type="email"
,
когда jquery.validate.js
загружен (правильно), novalidate="novalidate"
атрибут добавлен в form
элемент, который указывает, что форма не должна быть проверена (используя проверку HTML5) при отправке. Соответствующий код от jquery.validate.js
есть (приблизительная строка 35)
// Add novalidate tag if HTML5.
this.attr('novalidate', 'novalidate');
Это добавлено для предотвращения возможной путаницы между сообщениями об ошибках, отображаемыми при проверке браузера и ненавязчивой проверкой jquery.
Что касается почему DataTypeAttribute
атрибут наследует ValidationAttribute, когда он фактически не выполняет проверку, от самого Брэда Уилсона в этом ответе
Причина, по которой он вытекает из ValidationAttribute, заключается в том, что вы можете создать новый класс пользовательских типов данных, который был одновременно DataType и Validation, все они объединены в один. Это нежелательный побочный эффект.NET, не допускающий множественное наследование.