Подтвердить что ты не робот

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

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

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

Любые мысли??? Я бы подумал, что это наследование не было достаточно стандартным, но могло бы происходить достаточно часто, чтобы быть удовлетворенным. Спасибо за ответ.

Приветствия

4b9b3361

Ответ 1

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

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

Ответ 2

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

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