Frage

Ich habe mehr als ein wenig Schwierigkeiten, zu debuggen, warum MVC in einem bestimmten Fall, den ich habe, nicht richtig bindet ...

Grundsätzlich habe ich meine Aktion, die ein komplexes Objekt erhält, das wiederum ein komplexes untergeordnetes Objekt hat - Aktivität.Location.state (wobei Aktivität das komplexe Objekt ist, das die Aktion erwartet, der Ort ist ein komplexes untergeordnetes Objekt und Zustand ist nur eine Zeichenfolge). .

Jetzt habe ich ein Testprojekt eingerichtet, das genau das eigentlich nachdenkliche Szenario nachahmt, in diesem Testfall funktioniert die Bindung ... aber in meinem eigentlichen Projekt funktioniert die Bindung an Aktivität, aber nicht nach Ort ... Durch das Einlegen von Bruchpunkten in die Locaiton -Eigenschaft kann ich feststellen, dass MVC das komplexe Standortobjekt aus der Aktivität abruft, aber keine der Eigenschaften festlegt ...

Ich versuche, das Problem zu debuggen, aber ich brauche Zugriff auf die Symbole MVC V2 Preview 2, die ich nicht aufspüren kann ... Ich würde gerne sehen, was es tatsächlich tut, wenn es das Standortobjekt herauszieht (für einige Grund, warum ich denke, dass es innen scheitern könnte, aber die Ausnahme schluckt).

Alle Ideen darüber, was ich hier tun könnte ...

Prost Anthony

AKTUALISIEREN:

Ok, ich habe das getan, was JW vorgeschlagen hat, und verweist direkt auf das MVC -Projekt ...

Ich fand das Problem und es gab einen sehr kleinen Unterschied, den ich übersehen habe. Als ich Ergebnis habe, fand ich heraus, dass MVC derzeit nicht mehrere Grenzflächenvererben bei der Modellbindung unterstützt ... siehe folgende ...

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

Daher habe ich festgestellt, dass MVC den Ort findet und seinen Meta -Typ als Ilocation liest. Wenn jedoch GetModelProperties innerhalb des defaultModelBinder ausgeführt wird, tritt folgende auf -

    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
    }

Daher gehe ich an dieser Stelle davon aus, dass typedescriptionProvider diesen Erbungsstil nicht unterstützt, von dem ich ziemlich überrascht bin. Wenn Sie sich auch die V1 -Quelle ansehen, sieht es so aus, als würde diese mit V2 eingeführt - aber V1 konnte möglicherweise nicht unterstützen, was ich sowieso versuche.

Ich würde nicht sagen, dass dies wirklich ein Fehler ist, aber ich habe versucht, meine Schnittstellen durch konkrete Klassen zu ersetzen, und es hat gut funktioniert. Daher ist das Verhalten nicht wirklich das, was ich erwarten würde und ist ein wenig inkonsistent.

Irgendwelche Gedanken ??? Ich hätte gedacht, dass diese Erbschaft nicht ziemlich Standard war, aber oft genug auftreten würde, um dafür gesorgt zu werden. Danke für die Antwort.

Prost

War es hilfreich?

Lösung

Es stellt sich heraus, dass dieses Verhalten aufgrund der Funktionsweise der Schnittstellenvererbung entworfen wird. Schnittstellen definieren keine Implementierungen, daher "erben" die Eigenschaften von Ilocationsource nicht. Vielmehr definiert Ilocation nur, was eine konkrete Implementierung implementieren muss.

Die vollständigen Details einschließlich des Abschnitts der CLI -Spezifikation (Common Language Infrastructure), die dieses Verhalten definiert, lesen Sie: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

Andere Tipps

Ich würde einfach auf den in Codeplex veröffentlichten ASP.NET MVC2 -Quellcode verweisen. Ich habe das getan, es ist sehr einfach.

Es gibt Ihnen viel besseres Verständnis beim Debuggen des Quellcodees.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top