Проверка ViewModel, расширенной от POCO, с использованием IValidatableObject
Представить User
учебный класс. Этот класс предоставляет единственные свойства, которые используются в базе данных.
public class User
{
public string Login { get; set; }
public string Password { get; set; }
public DateTime ActiveDateStart { get; set; }
public DateTime ActiveDateEnd { get; set; }
}
И посмотреть модель для User
класс с валидаторами
public class UserViewModel: User, IValidatableObject
{
[Required(ErrorMessage = "Enter login")]
[RegularExpression("[a-zA-Z][a-zA-Z0-9]*", ErrorMessage = "Only alpha and digits")]
new public string Login { get; set; }
[Required(ErrorMessage = "Enter password")]
new public string Password { get; set; }
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (ActiveDateStart > ActiveDateEnd)
{
yield return new ValidationResult("Active period start must be before perion end date", new[] { "ActiveDateStart" });
}
}
}
Посмотреть
<div class="form-group">
@Html.LabelFor(m => m.Login })
@Html.TextBoxFor(m => m.Login })
@Html.ValidationMessageFor(m => m.Login)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password })
@Html.PasswordFor(m => m.Password })
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ActiveDateStart })
@Html.TextBoxFor(m => m.ActiveDateStart })
@Html.ValidationMessageFor(m => m.ActiveDateStart)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ActiveDateEnd })
@Html.TextBoxFor(m => m.ActiveDateEnd })
@Html.ValidationMessageFor(m => m.ActiveDateEnd)
</div>
@Html.ValidationSummary()
контроллер
[HttpPost]
public ActionResult Create(UserViewModel model)
{
if (ModelState.IsValid)
{
// do something
}
return View(model);
}
проблема
Вся проверка, указанная с помощью атрибутов, успешно выполнена, и все ошибки успешно показаны в представлении. Но проверка сделана через IValidatableObject
не работают и ошибки не отображаются.
1 ответ
Решение
Я нашел ответ
метод Validate
не вызывается, пока контроллер не выполнит все остальные проверки.
PS Не уходи. Лучше посмотреть на MetaDataTypeAttribute.