У меня есть абстрактный класс и несколько дочерних классов, и я использую связыватель абстрактной модели из этого ответа , чтобы связать их в определенный класс.
public abstract class BaseProductViewModel
{
public int Id { get; set; }
public string Type { get => GetType().FullName; }
public int DealerId { get; set; }
}
public class MortgageViewModel : BaseProductViewModel
{
// other properties with validation attributes
}
public class InsuranceViewModel : BaseProductViewModel
{
// other properties with validation attributes
}
Моя модель редактирования редактирования имеет коллекциюиз этих классов и некоторых других свойств.
public class EditFormViewModel
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
// other properties with validation attributes
public IList<BaseProductViewModel> Products { get; set; }
}
Отображение работает нормально, но проверка списка продуктов является проблемой.Я также добавил валидацию в метод BindModelAsync:
using (bindingContext.EnterNestedScope(metadata, bindingContext.FieldName, bindingContext.ModelName, model: null))
{
await binder.BindModelAsync(bindingContext);
result = bindingContext.Result;
var validationResult = from prop in TypeDescriptor.GetProperties(result.Model).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(result.Model))
select new { Propertie = prop.Name, ErrorMessage = attribute.FormatErrorMessage(string.Empty) };
foreach (var validationResultItem in validationResult)
bindingContext.ModelState.AddModelError(validationResultItem.Propertie, validationResultItem.ErrorMessage);
}
ModelState.IsValid всегда возвращает false (ValidationState не проверен), поэтому я пытаюсь очистить его и снова подтвердить его явно.Теперь он проверяет, но только свойства EditFormViewModel, а не свойства элементов Products.