Question

J'ai plus un peu de difficulté à essayer de déboguer pourquoi MVC ne lie pas correctement dans un cas donné, j'ai ...

En fait, j'ai mon action qui reçoit un objet complexe qui à son tour a un objet enfant complexe - Activity.Location.State (où l'activité est l'objet complexe que l'action attend, l'emplacement est un objet enfant complexe et de l'Etat est juste une chaîne).

Maintenant, je mis en place un projet de test qui, autant que je peux dire exactement imite le scénario en fait j'ai, dans ce cas de test Les travaux de liaison ... Mais dans mon projet en fait, la liaison aux travaux d'activité, mais pas Emplacement ... en mettant des points de rupture dans la propriété Locaiton je peux dire que MVC est l'objet complexe récupère Lieu de l'activité, mais son emplacement aucune des propriétés ...

Je suis en train de déboguer la question, mais je besoin d'accéder à la MVC v2 aperçu 2 symboles que je ne peux pas sembler traquer ... je voudrais voir ce qu'il est en train de faire une fois qu'il sort l'objet emplacement (pour une raison quelconque, je pense qu'il pourrait être un échec interne mais à avaler l'exception).

Toutes les idées sur ce que je pouvais faire ici ...

Vive Anthony

Mise à jour:

Ok je l'ai fait ce que J.W. suggéré et référencer directement le projet MVC ...

J'ai trouvé le problème et il y avait une très petite différence que je ... Comme je l'ai négligé Résultat j'ai découvert que MVC ne prend pas en charge plusieurs niveaux d'héritage INTERFACE en matière de modèle de liaison ... Voir ci-après. ..

//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)
{
}

D'où ce que j'ai trouvé que MVC trouve l'emplacement et lit son type méta comme ILocation, mais quand GetModelProperties est exécuté dans le DefaultModelBinder ce qui suit se produit -

    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
    }

D'où je suppose à ce moment que TypeDescriptionProvider ne supporte pas ce style d'héritage, que je suis très surpris. Aussi la recherche à la source v1 il semble que cela a été introduit avec v2 -. mais v1 peut-être pas été en mesure de soutenir ce que je suis en train de faire de toute façon

Je ne dirais pas que ce soit vraiment un bug, mais j'essayé de remplacer mes interfaces avec des classes concrètes et il a bien fonctionné. D'où le comportement est pas vraiment ce que je pense et est un peu incohérent.

Toutes les pensées ??? J'aurais pensé que cet héritage n'était pas assez standard, mais se produirait assez souvent pour être pris en charge. Merci pour la réponse.

Vive

Était-ce utile?

La solution

Transforme ce comportement est dû à la façon dont fonctionne l'héritage d'interface. Interfaces ne définissent pas mises en œuvre, ILocation ne constitue donc pas « hériter » les propriétés de ILocationSource. Au contraire, ILocation définit seulement ce qu'est une mise en œuvre concrète doit mettre en œuvre.

Pour tous les détails, y compris la section de la CLI (Common Language Infrastructure) spec qui définit ce comportement, consultez: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

Autres conseils

Je voudrais simplement faire référence au code source asp.net MVC2 publiée dans CodePlex. Je l'ai fait, il est très simple.

Il vous donnera beaucoup mieux quand vous le débogage dans le code source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top