ASP.net MVC v2 - Проблемы с привязкой модели отладки - ОШИБКА?

StackOverflow https://stackoverflow.com/questions/1676731

Вопрос

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

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

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

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

Есть какие-нибудь идеи о том, что я мог бы здесь сделать...

Ваше здоровье Энтони

Обновить:

Хорошо, я сделал то, что Дж.У.предлагается и непосредственно ссылается на проект MVC...

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

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

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

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

Ваше здоровье

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top