Как проверить модель представления с коллекцией абстрактных элементов - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть абстрактный класс и несколько дочерних классов, и я использую связыватель абстрактной модели из этого ответа , чтобы связать их в определенный класс.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...