Связывание модели для ссылки на абстрактный класс в абстрактном классе asp. net core mvc 3 - PullRequest
0 голосов
/ 09 июля 2020

Я следую по адресу Связыватель модели для абстрактного класса в asp. net core mvc 2 , но моя модель не связывает HostedControls в ConcreteControlHost (см. Ниже). Если я изменю тип HostedControls на ConcreteControlText [], он будет привязан. Я хотел бы сохранить его как AbstractControl [], чтобы я мог размещать несколько типов управления.

Я знаю, что абстрактное связыватель работает, потому что связывает MainModel.Controls.

При отладке привязки из ConcreteControlHost, в binder._propertyBinders есть запись для HostedControls, как показано ниже: {[ModelMetadata (Property: 'ConcreteControlHost.HostedControls' Type: 'AbstractControl[]'), {Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinder<MyProject.AbstractControl>}]} После этого свойства (Value.ElementBinder.Inner) в конечном итоге приводит к AbstractModelBinder.

Точки останова в AbstractModelBinder не достигаются при привязке свойств ConcreteControlHost, но возникают при привязке свойств MainModel (как в I получить совпадения для ConcreteControlHost, но не для ConcreteControlText).

Это не связано с В шаблоне редактора вызовите другой шаблон редактора с той же моделью , потому что это не та же модель , и поскольку все отображается правильно, привязка не выполняется. MainModel.Controls не ссылается ни на один из ConcreteControlTexts, на который ссылается HostedControls.

public class MainModel {
   public AbstractControl[] Controls;
}

public abstract class AbstractControl {
   public string TypeName { get; set;}
}

public class ConcreteControlText: AbstractControl {
   public string Text { get; set; }
}

public class ConcreteControlHost: AbstractControl {
   public AbstractControl[] HostedControls { get; set; }
}

Кто-нибудь видит, что мне нужно изменить, чтобы привязка модели работала в ConcreteControlHost.HostedControls?

1 Ответ

0 голосов
/ 09 июля 2020

Оказывается, в моем фактическом коде HostedControls имел { get; private set; }. Удаление модификатора private на сеттере заставило его работать.

Джереми, спасибо, что изучили это.

...