Я должен был бы проверить код ASP.NET MVC (DefaultModelBinder), но я предполагаю, что он отражает тип IProfile, а не экземпляр StandardProfile.
Таким образом, он ищет любые элементы IProfile, которые может пытаться связать, но это пустой интерфейс, поэтому он считает себя выполненным.
Вы можете попробовать что-то вроде обновления BindingContext и изменения ModelType на StandardProfile, а затем вызова
bindingContext.ModelType = typeof(StandardProfile);
IProfile profile = base.BindModel(controllerContext, bindingContext);
В любом случае, иметь пустой интерфейс странно ~
Редактировать: просто хотите добавить, что приведенный выше код является просто псевдокодом, вам нужно проверить DefaultModelBinder, чтобы увидеть, что именно вы хотите написать.
Изменить # 2:
Можете ли вы сделать:
public class ProfileModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
{
bindingContext.ModelType = typeof(StandardProfile);
return base.BindModel(controllerContext, bindingContext);
}
}
Нет необходимости связывать модель для AccountView, она отлично работает.
Редактировать # 3
Протестировано, вышеприведенное связующее работает, просто нужно добавить:
ModelBinders.Binders[typeof(IProfile)] = new ProfileModelBinder();
Ваше действие выглядит так:
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is fully populated, including profile, don't call UpdateModel
}
Вы можете использовать IOC при настройке связывателя модели (например, с помощью инжектора конструктора типов).