ASP.net MVC v2 - отладка проблем привязки модели - ошибка?

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

По сути, у меня есть действие, которое получает сложный объект, который, в свою очередь, имеет сложный дочерний объект - Activity.Location.State (где Activity - сложный объект, который ожидает действие, Location - сложный дочерний объект, а State - просто строка),

Теперь я настроил тестовый проект, который, насколько я могу точно сказать, имитирует реальный сценарий, который у меня есть, в этом тестовом случае привязка работает... Но в моем собственном проекте привязка к Activity работает, но не к Location... Помещая точки останова в свойстве Locaiton, я могу сказать, что MVC извлекает сложный объект Location из Activity, но не устанавливает никаких свойств...

Я пытаюсь отладить проблему, но мне нужен доступ к символам предварительного просмотра 2 MVC v2, которые я не могу отследить... Я хотел бы увидеть, что он на самом деле делает, когда вытаскивает объект местоположения (для некоторых причина, я думаю, что это может быть внутренняя ошибка, но проглатывание исключения).

Любые идеи о том, что я мог бы сделать здесь...

Ура Энтони

ОБНОВИТЬ:

Хорошо, я сделал то, что предложил JW, и прямо ссылался на проект 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, возможно, все равно не смог бы поддержать то, что я пытаюсь сделать.

Я бы не сказал, что это действительно ошибка, но я попытался заменить свои интерфейсы конкретными классами, и это работало нормально. Следовательно, поведение не совсем то, что я ожидал, и немного противоречиво.

Какие-нибудь мысли??? Я бы подумал, что это наследие не является достаточно стандартным, но будет происходить достаточно часто, чтобы обслужить. Спасибо за ответ.

ура

2 ответа

Решение

Оказывается, такое поведение предусмотрено проектом из-за того, как работает наследование интерфейса. Интерфейсы не определяют реализации, поэтому ILocation не "наследует" свойства ILocationSource. Скорее, ILocation определяет только то, что должна реализовывать конкретная реализация.

Для получения полной информации, включая раздел спецификации CLI (Common Language Infrastructure), который определяет это поведение, посетите: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

Я бы просто сослался на исходный код asp.net mvc2, опубликованный в codeplex. Я сделал это, это очень просто.

Это даст вам лучшее понимание при отладке исходного кода.

Другие вопросы по тегам