Я могу подтвердить, что он работает, когда «вставляет» элемент, но это похоже на проблему с определенными типами проверочных аннотаций.
Похоже, что если у вас есть атрибут [Required]
, проверка не будет запущена, если вы просто tab
введете соответствующий ввод.
Если у вас есть [RegularExpression]
, то это срабатывает, когда вы выходите.
Я подозреваю, что проверка запускается комбинацией событий onechange
и blur
. Это объясняет, почему регулярное выражение может быть проверено (как оно изменилось), но не является обязательным тестом.
Это мой вид модели:
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a first name")]
[StringLength(50, ErrorMessage = "Maximum of 50 characters")]
public string FirstName { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a last name")]
[StringLength(50, ErrorMessage = "Maximum of 50 characters")]
public string LastName { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a unique email address")]
[CustomValidation(typeof(User), "ValidateUniqueEmailAddress")]
[StringLength(255, ErrorMessage = "Maximum of 255 characters")]
[RegularExpression(EmailRegEx, ErrorMessage = "Invalid email address entered")]
public string EmailAddress { get; set; }
и HTML-код.
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
{%>
<%: Html.ValidationSummary(true) %>
<fieldset class="colLeft">
<legend>Required Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.FirstName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.FirstName) %>
<%: Html.ValidationMessageFor(model => model.FirstName) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.LastName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.LastName) %>
<%: Html.ValidationMessageFor(model => model.LastName) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.EmailAddress) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.EmailAddress) %>
<%: Html.ValidationMessageFor(model => model.EmailAddress) %>
</div>
Как видите, ничего сложного.
В этом случае, когда вы просматриваете все входные данные (имя, фамилия, адрес электронной почты), проверка [Required]
не запускается ни на одном из них. Если вы введете неверный адрес электронной почты, а затем перейдете на вкладку, будет запущена проверка [RegularExpression]
.
Похоже, ошибка / особенность одной из библиотек валидации.
ПРИМЕЧАНИЕ. Я протестировал это в VS 2010, поскольку у меня нет доступа к VS 2008, но я не вижу, как это будет отличаться в двух версиях, поскольку код между ними точно такой же. Я также использовал Google Chrome.