Почему проверка не работает с 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, не допускающий множественное наследование.

Другие вопросы по тегам