2011-01-10 24 views
37

Potete darmi qualche consiglio generale su come eseguire il debug di Binding di ASP.NET MVC?Best practice per il debug di ASP.NET MVC Binding

Quando tutto funziona come previsto, ASP.NET MVC è eccezionale. Ma se qualcosa non va, come qualcosa che non si lega per qualche motivo sconosciuto, trovo difficile rintracciare il problema e mi ritrovo a passare ore a rintracciare un problema apparentemente semplice.

Immaginiamo che si terra in un metodo di controllo come questo:

[HttpPost] 
public ActionResult ShipmentDetails(Order order) 
{ 
    //do stuff 
} 

Diamo inoltre immaginare che la classe Order si presenta così:

public class Order 
{ 
    public decimal Total {get; set;} 
    public Customer Customer {get; set;} 
} 

public class Customer 
{ 
    public string Name {get; set;} 
    public string Phone {get; set;} 
} 

Quali sono buoni punti di partenza quando Order nel il metodo del controller non è associato correttamente? Quali sono i posti migliori in cui iniziare quando solo alcune parti di Order sono collegate correttamente?

risposta

20

Come suggerito da Darin, iniziare con l'ispezione di ciò che viene inviato dal client al server usando qualcosa come Firebug, Fiddler o altri strumenti di proxy di debug del web.

In caso contrario, è possibile scorrere il codice sorgente per vedere cosa succede durante l'associazione.

Due modi che posso consigliare a fare questo sono

  1. Include the System.Web.Mvc source code project in your application and reference this. Questo è utile per l'apprendimento, ma probabilmente non è raccomandato per un'applicazione commerciale.

  2. Scarica i simboli per System.Web.Mvc dai server Microsoft Symbol, modificare le impostazioni di essere in grado di debug framework source code and set a break point appropriately to step through.

+0

'" imposta un punto di interruzione in modo appropriato "' Dove si trova questo per il raccoglitore del modello? – StuperUser

+2

Si desidera impostare un punto di interruzione nella classe 'DefaultModelBinder' del framework MVC' 'oggetto pubblico virtuale BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext)' metodo –

+1

Dopo aver abilitato/scaricato i simboli, come si può effettivamente arrivare alla fonte per ' DefaultModelBinder' per impostare il punto di interruzione? –

3

Un buon punto di partenza è scaricare e installare FireBug e vedere cosa viene inviato dal client al server. Quindi vedrai cosa manca, non è corretto ... Post del blog come Model Binding to a List sono anche buone letture per familiarizzare con la sintassi corretta utilizzata dal raccoglitore modello predefinito.

+0

Ma non ti dice quale legame di mvc fa con i dati ... c'è un modo per tenere traccia del processo di associazione del modello? – Dani

+0

@Dani, cosa vuoi sapere sul binding del modello? È abbastanza straigtforward: un campo di input denominato 'Customer.Name' si legherà alla proprietà' Name' di una proprietà 'Customer' complessa di un modello. Non c'è niente di speciale in questo. E una volta ottenuto il concetto di liste e raccolte, sai tutto quello che c'è da sapere su come funziona il binding di modelli. Quando non lo fa, FireBug ti mostrerà la richiesta e saprai immediatamente perché una proprietà non è stata vincolata: è perché manca la richiesta, ha un nome non valido o un formato non valido. –

+0

Immagino che mi manca la raccolta e le liste e cosa fare con i nuovi oggetti. gli esempi che ho usato fino ad ora aggiungono righe alla griglia con ID casuale e niente limiti nel mio codice, ho visto un esempio che tenta di ri-numerare, ma l'esempio originale (steve Sandersen) funziona senza di esso ... .. – Dani

23

Anche se @russ's answer è utile e sarà talvolta necessario, entrambe le opzioni sembrano un po 'basso livello quando la questione principale è di più il quadro generale. Quindi, mi consiglia di Glimpse.

Dalla sua pagina su:

& hellip; Glimpse ti consente di eseguire il debug del tuo sito web o servizio web direttamente nel browser. Glimpse ti permette di "intravedere" ciò che accade nel tuo server web. In altre parole, Firebug esegue il debug del codice lato client, Glimpse esegue il debug del server all'interno del client.

E dal momento che hai chiesto espressamente l'associazione dei dati, ti consigliamo di dare un'occhiata allo binding tab documentation.Sarete in grado di vedere, ancora una volta dalla documentazione:

  1. ordinale: Ordine in cui l'infrastruttura Binding MVC modello ha tentato di associare i dati disponibili
  2. modello Binder: Modello Raccoglitore che è stato utilizzato in un dato scenario
  3. Proprietà/parametri: nome della cosa che la Binder stava cercando di legare
  4. Tipo: Tipo della cosa che il legante è stato cercando di legare
  5. Tentativo Provider valore: Provider che il legante tentato di utilizzare per ottenere un dato valore (e se ha avuto successo)
  6. Tentativo Valore: Il valore effettivo che il provider deve lavorare con (tipo di conversazione postale, ecc)
  7. Cultura: la cultura che è stato utilizzato per analizzare il valore grezzo Raw valore: il valore grezzo che il provider deve lavorare con (conversazione di tipo pre, etc.)

Vedere quick start. In breve:

  1. Installare il pacchetto glimpse.mvc3
  2. Vai a http://yourhost/yourapp/Glimpse.axd e "accenderlo".
  3. Fare clic sull'icona dell'intuizione in basso a destra di qualsiasi vista nell'app per i dettagli.
+0

Risposta molto utile, grazie! – nrodic

Problemi correlati