У меня есть несколько трудностей с попыткой отладки, почему MVC неправильно привязывается в данном случае...
В принципе, у меня есть мое действие, которое получает сложный объект, который, в свою очередь, имеет сложный дочерний объект - Activity.Location.State(где Activity - это сложный объект, который ожидает действие, Location - это сложный дочерний объект, а State - просто строка).
Теперь я настроил тестовый проект, который, насколько я могу сказать, точно имитирует фактический сценарий, который у меня есть, в этом тестовом случае привязка работает... Но в моем проекте действительно работает привязка к Activity, но не к Location... Поставив точки останова в свойстве Locaiton, я могу сказать, что MVC извлекает сложный объект Location из Activity, но не устанавливает никаких свойств...
Я пытаюсь отладить проблему, но мне нужен доступ к символам предварительного просмотра MVC v2 2, которые я не могу отследить... Я хотел бы посмотреть, что он на самом деле делает, когда он вытаскивает объект местоположения (по какой-то причине я думаю, что это может быть неудачно внутри, но проглатывание исключения).
Любые идеи о том, что я могу здесь сделать...
Приветствия Энтони
UPDATE:
Хорошо, я сделал то, что J.W. предложил и прямо ссылается на проект MVC...
Я нашел проблему, и было одно очень маленькое различие, которое я упустил. В результате я узнал, что MVC в настоящее время не поддерживает несколько уровней наследования INTERFACE, когда дело доходит до привязки модели... См. следующее...
//MODEL
public class Location : ILocation
{
...
}
public interface ILocation : ILocationCore
{
...
}
public interface ILocationCore //In my sample I didn't have this second level interface
{
...
//MVC doesn't find any of these properties
...
}
public class Activity : IActivity
{
...
}
public interface IActivity : IActivityCore
{
ILocation Location { get; set; } //MVC finds this and reads its meta type as an ILocation
//Also the implementation of this Location within Activity will always return a instance - our IoC takes care of that, so MVC should never have to create the instance
}
public interface IActivityCore
{
...
}
//CONTROLLER
public ActionResult Create(Activity activity)
{
}
Следовательно, я нашел, что MVC находит Location и читает его мета-тип как ILocation, но когда GetModelProperties запускается в DefaultModelBinder, происходит следующее:
protected virtual PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) {
return GetTypeDescriptor(controllerContext, bindingContext).GetProperties();
//This return no properties
}
protected virtual ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext) {
return new AssociatedMetadataTypeTypeDescriptionProvider(bindingContext.ModelType).GetTypeDescriptor(bindingContext.ModelType);
//bindingContext.ModelType - is ILocation
}
Поэтому я предполагаю, что TypeDescriptionProvider не поддерживает этот стиль наследования, который я очень удивляюсь. Также глядя на источник v1, похоже, что это было введено с v2, но v1, возможно, не смог поддерживать то, что я пытаюсь сделать в любом случае.
Я бы не сказал, что это действительно ошибка, но я попытался заменить мои интерфейсы конкретными классами, и это сработало нормально. Следовательно, поведение на самом деле не то, что я ожидаю, и немного непоследователен.
Любые мысли??? Я бы подумал, что это наследование не было достаточно стандартным, но могло бы происходить достаточно часто, чтобы быть удовлетворенным. Спасибо за ответ.
Приветствия