Domanda

Sto avendo più di un po 'di difficoltà cercando di eseguire il debug perché MVC non è vincolante in modo corretto in un dato caso ho ...

In sostanza, ho la mia azione che riceve un oggetto complesso che a sua volta ha un oggetto figlio complesso - Activity.Location.State (dove l'attività è l'oggetto complesso che l'azione si aspetta, la posizione è un oggetto figlio complesso e Stato è solo una stringa).

Ora ho creato un progetto di test che, per quanto posso dire esattamente imita la realtà scenario che ho, in questo caso di test le opere di legame ... Ma nel mio progetto in realtà, il legame con le opere di attività, ma non per Località ... mettendo punti di rottura all'interno della proprietà Locaiton posso dire che MVC sta recuperando l'oggetto Location complesso dal Activity, ma la sua non impostare una delle proprietà ...

Sto cercando di eseguire il debug del problema, ma ho bisogno di accesso al v2 anteprima MVC 2 simboli, che io non riesco a rintracciare ... vorrei vedere che cosa sta effettivamente facendo una volta che si tira fuori l'oggetto posizione (per qualche motivo penso che potrebbe essere fallendo internamente, ma inghiottire l'eccezione).

Tutte le idee su cosa avrei potuto fare qui ...

Saluti Anthony

UPDATE:

Ok ho fatto quello che J.W. suggerito e direttamente riferimento al progetto MVC ...

Ho trovato il problema e c'era una piccolissima differenza che ho trascurato ... Come ho conseguenza ho scoperto che MVC attualmente non supporta più livelli di INTERFACCIA eredità quando si tratta di modellare vincolante ... Vedere il seguente. ..

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

Quindi quello che ho trovato è che MVC trova la posizione e legge il suo tipo di meta come un ILocation, ma quando GetModelProperties viene eseguito all'interno del DefaultModelBinder si verifica quanto segue -

    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
    }

Quindi io parto dal presupposto a questo punto che TypeDescriptionProvider non supporta questo tipo di eredità, che sono abbastanza sorpreso. Anche guardando il sorgente v1 sembra che questo è stato introdotto con v2 -. Ma v1 non sarebbe stato in grado di sostenere quello che sto cercando di fare in ogni caso

Non direi che questo è davvero un bug, ma ho provato a sostituire i miei le interfacce con le classi di cemento e ha funzionato bene. Da qui il comportamento non è proprio quello che ci si aspetta e è un po 'incoerente.

Qualche idea ??? Avrei pensato che questa eredità non era abbastanza standard, ma si sarebbe verificato spesso sufficiente per essere soddisfatti. Grazie per la risposta.

Saluti

È stato utile?

Soluzione

Risulta questo comportamento legato alla progettazione a causa di come funziona l'interfaccia eredità. Le interfacce non definiscono implementazioni, quindi ILocation non "ereditano" le proprietà di ILocationSource. Piuttosto, ILocation definisce solo ciò che una concreta attuazione deve implementare.

Per tutti i dettagli, tra cui la sezione del CLI (Common Language Infrastructure) spec che definisce questo comportamento, check out: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

Altri suggerimenti

Vorrei semplicemente riferimento al codice sorgente asp.net MVC2 pubblicato in CodePlex. L'ho fatto, è molto semplice.

Vi darà molto migliore comprensione quando si debug attraverso il codice sorgente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top