Я все это отладил и заметил, что вызывается конструктор валидатора (и не один раз, что странно). То есть моя фабрика IoC работает правильно. Кастомная валидация с сервисными вызовами (правила с наборами правил) работает нормально (я отлаживал - звонки делал). Но стандартные правила проверки (свойство NotEmpty, Length, Matches и Must for Categories) не работают — ошибок проверки в объекте ModelState нет.
Это все работает на ранней стадии, я не меняю код, размещенный здесь. Глобальные привязки модели не были изменены/добавлены. У меня нет идей.
Код для модели с неработающей проверкой:
Мое сообщение:
[HttpPost]
public ActionResult CreateTest([CustomizeValidator(RuleSet = "New")] Test model)
{
if (ModelState.IsValid)
{
var testId = testService.CreateTest(model);
return RedirectToAction("Test", new { testId });
}
PrepareTestEdit(true);
return View("EditTest");
}
Моя модель:
[Validator(typeof(TestValidator))]
public class Test
{
public Test()
{
Categories = new List<string>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string UrlName { get; set; }
public List<string> Categories { get; set; }
}
Валидатор:
public class TestValidator : AbstractValidator<Test>
{
public TestValidator(ITestService testService)
{
RuleSet("Edit", () =>
{
RuleFor(x => x.Title).
Must((model, title) => testService.ValidateTitle(title, model.Id)).WithMessage("1");
RuleFor(x => x.UrlName).
Must((model, urlName) => testService.ValidateUrlName(urlName, model.Id)).WithMessage("2");
});
RuleSet("New", () =>
{
RuleFor(x => x.Title).
Must(title => testService.ValidateTitle(title)).WithMessage("3");
RuleFor(x => x.UrlName).
Must(urlName => testService.ValidateUrlName(urlName)).WithMessage("4");
});
RuleFor(x => x.Title).
NotEmpty().WithMessage("5").
Length(1, 100).WithMessage("6");
RuleFor(x => x.UrlName).
NotEmpty().WithMessage("7").
Length(1, 100).WithMessage("8").
Matches("^[-_a-zA-Z0-9]*$").WithMessage("9");
RuleFor(x => x.Description).
NotEmpty().WithMessage("10");
RuleFor(x => x.Categories).
Must(categories => categories != null && categories.Any()).WithMessage("11");
}
}