Я перенес приложение MVC4 в MVC6 (оба .net 4.6.1), и у меня возникают многочисленные ошибки при проверке встроенной модели.
У меня есть ряд сложных моделей, которые отправляются на контроллеры,и если я не отключу проверку для каждой модели в службах настройки, они будут выдавать ненужные исключения, относящиеся к свойствам, которые не имеют отношения к проверке, или просто зависают после обратной передачи, не достигая действия контроллера.
Я добавил следующую строку в конфигурацию MVC для всех моих затронутых классов, но теперь у меня есть модель, требующая проверки, поэтому ее отключение приведет к многочисленным изменениям кода.
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(TestModel)));
Я пробовал это с тестовым приложением и могу воспроизвести проблему:
Тестовый контроллер:
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Index(TestModel model)
{
return View();
}
Тестовая модель (например)
public class TestModel
{
[Required]
public string Name { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
public int NameLength
{
get
{
return Name.Length;
}
}
}
БезАтрибуты валидации, код работает нормально, но не валидирован (очевидно).
Но когда эта модель публикуется, исключение NullReference вызывается свойством NameLength, хотя ни один код не ссылается на него, свойство доступно только для чтения, и свойство, от которого оно зависит, является обязательным.Эта проверка происходит до того, как управление возвращается контроллеру.
Я пытался отключить эту функцию в MvcOptions, но она не дает никакого эффекта:
options.MaxValidationDepth = null;
options.AllowValidatingTopLevelNodes = false;
options.AllowShortCircuitingValidationWhenNoValidatorsArePresent = true;
Я не знаюесли есть параметр, который я пропускаю, но я ожидаю, что функциональность по умолчанию будет игнорировать свойства без атрибутов проверки, или я делаю что-то не так?
Заранее благодарен за помощь.
В дополнение к предложению @Henks, я добавил атрибут ValidateNever в свойства только для чтения одного класса, с которым у меня возникли проблемы, и это сработало, поэтому обратная передача теперь достигает контроллера, но она все еще вызывает свойства, кажется, что она просто игнорируетрезультат:
[ValidateNever]
public Competition PrimaryCompetition
{
get
{
return GetCompetition(true);
}
}
Это все еще вызывает исключение нулевой ссылки, потому что оно опирается на другое свойство, которое [Обязательно], но не проверено первым.
Я начинаю думать, что этоошибка, а не ошибка с моей стороны.