Проверка 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.

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