У меня есть модель, содержащая свойство на основе интерфейса, конкретная реализация которого может быть обнаружена через другое свойство модели.
public class SubscriptionViewModel
{
public Guid Id { get; set; }
...
public SubscriptionTypeEnum SubscriptionType { get; set; } // <- Determines the concrete class
public ISubscriptionCriteria SubscriptionCriteria { get; set; } //<- Property based on interface class
...
}
Когда присутствует свойство, основанное на интерфейсе, модель в контроллере становится нулевой. Если удалить, все связывается, как и ожидалось.
[HttpPost("api/[controller]/[action]")]
public async Task Post([FromBody]SubscriptionViewModel model)
{
...
}
Это произойдет потому, что контроллер не знает, какую надежную реализацию использовать для интерфейса.
Любые идеи, как я могу это решить? Похоже, что это может быть достижимо с помощью пользовательского IModelBinderProvider
или BindingBehaviorAttribute
?
Думаю, у меня могла бы быть реализация SuperSubscriptionCriteria
, содержащая все возможные свойства, используемые конкретными реализациями ISubscriptionCriteria
, а затем полагаться на AutoMapper для преобразования их в реальные реализации. Но это похоже на взлом и потребует постоянного обслуживания по мере добавления новых реализаций ISubscriptionCriteria
.
ISubscriptionCriteria
в ViewModel? Мне просто интересно. - person Win   schedule 19.07.2017ISubscriptionCriteria
? Обычно ViewMode MVC не имеет внешних зависимостей, если только вы не используете его как MVVM. Просмотр модели. - person Win   schedule 19.07.2017