2009-07-09 12 views
5

Ho modificato l'applicazione Nerd Dinner per consentire la modifica dei record figlio aggiungendo il seguente codice al DinnerForm.ascxAggiornamento padre/figlio record con leganti modello in ASP.Net MVC

<p> 
    <%int i = 0; 
    foreach (NerdDinner.Models.RSVP rsvp in this.Model.Dinner.RSVPs) 
     { %> 

     <%= Html.Hidden("Dinner.RSVPs[" + i + "].RsvpID", rsvp.RsvpID)%> 
     <%= Html.Hidden("Dinner.RSVPs[" + i + "].DinnerID", rsvp.DinnerID)%> 
     <%= Html.TextBox("Dinner.RSVPs[" + i + "].AttendeeName", rsvp.AttendeeName)%> 
    <% i += 1; 
    } %> 
    </p> 

si sta rendendo questo:

<p> 
    <input id="Dinner_RSVPs[0]_RsvpID" name="Dinner.RSVPs[0].RsvpID" type="hidden" value="36" /> 
     <input id="Dinner_RSVPs[0]_DinnerID" name="Dinner.RSVPs[0].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[0]_AttendeeName" name="Dinner.RSVPs[0].AttendeeName" type="text" value="kp" /> 
    <input id="Dinner_RSVPs[1]_RsvpID" name="Dinner.RSVPs[1].RsvpID" type="hidden" value="37" /> 
     <input id="Dinner_RSVPs[1]_DinnerID" name="Dinner.RSVPs[1].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[1]_AttendeeName" name="Dinner.RSVPs[1].AttendeeName" type="text" value="jim" /> 

    </p> 

Non ho modificato il metodo di azione Post Edit di DinnersControler. La cena dei genitori si aggiorna come al solito, ma appare UpdateModel (cena); non sta visualizzando/aggiornando i record RSVP figlio.

Ho provato alcune varianti sul rendering dei record figlio in modo che i raccoglitori modello possano vedere la raccolta, senza fortuna.

Si sta aggiornando i record padre/figlio in uno scatto chiamando UpdateModel (Parent); possibile con gli attuali leganti modello?

risposta

4

Non sono stato in grado di farlo da solo.

So che è possibile aggiornare automaticamente un singolo elemento figlio, ad esempio, Dinner.RSV. Non ho mai visto la possibilità di aggiornare un bambino enumerabile, il che richiederebbe al bind di sapere quale proprietà è l'ID e cercarlo (cioè, Dinner.RSVP.Where (r => r.RSVP_ID == input_id) e poi aggiornalo). Non ne so abbastanza del binding personalizzato per fare qualcosa del genere.

Tuttavia, quello che ho fatto è quello di fare un ciclo e specificare il RSVP e l'int come prefisso:

in modo da:

UpdateModel("Dinner", Dinner); 

per aggiornare il genitore e poi:

int i = 0; 

foreach (var r in Dinner.RSVPs) { 
    UpdateModel(r, "Dinner.RSVPs[" + i++ + "]"); 
} 

Non proprio pulito, ma funziona bene per me. Tuttavia, potrebbe richiedere un po 'più di sforzo per costruire la convalida (si desidera convalidare tutti allo stesso tempo e assicurarsi di non tornare alla vista sul primo RSVP con un errore).

EDIT: Risolto il codice per riflettere la soluzione del PO, tra cui un bug nel mio ordine del parametro. Detto questo, mi sento più a mio agio nell'usare la proprietà RSVP.ID di un numero intero in esecuzione. Finché saprai che Dinner.RSVP sarà lo stesso sul POST come GET (sono fiducioso di ciò nel mio codice), quindi funzionerà con RSVP.ID. Se gli RSVP sono diversi, solo quelli presenti su entrambi verranno aggiornati. Tuttavia, l'uso della sequenza sequenziale potrebbe potenzialmente causare l'aggiornamento dell'oggetto errato.

Speranza che aiuta, James

+0

@jamesshannon Questa risposta è vicina. Correggere il modello di aggiornamento nel ciclo per leggere int i = 0; foreach (RSVP r in Dinner.RSVPs) { UpdateModel (r, "Dinner.RSVPs [" + i + "]"); i ++; } e possiamo contrassegnare questo fatto/risposta. –

0

Ok, quindi nessuno risponde. Non conosco l'app nerddinner, ma ero interessato al tuo problema. Speravo di vedere alcune risposte ma, beh, ancora nessuna. Non sicuro al 100% a causa della mancanza di familiarità con ndinner, ma potrebbe essere correlato a this post dove menzionano il binding/l'aggiornamento solo quando una proprietà viene passata esplicitamente?

0

La tua domanda è se l'aggiornamento dei record padre/figlio in un solo colpo chiamando UpdateModel (Capogruppo); possibile con gli attuali leganti modello?

Sì, questo è possibile.Tuttavia, è possibile non (senza alcuni accorgimenti secondari) se si utilizza Linq-to-Sql e gli oggetti figlio vengono esposti tramite EntitySet<T> anziché come IList<T>. Credo che questo sarà (è stato?) Affrontato nella prossima versione di MVC in uscita con ASP.NET 4.0. Per il momento, tuttavia, il raccoglitore modello predefinito MVC non sembra capire come lavorare con EntitySet.

Si prega di vedere questo other answer Ho scritto su una domanda correlata qualche tempo fa, con dettagli su come sto ora affrontando (aggirando) questa situazione in alcuni casi semplici. Nel fare questo, ho dovuto smettere di preoccuparmi così tanto di come "ideale" questa soluzione è da una prospettiva DDD/OOP, come un compromesso per ottenere semplicemente MVC e LTS per giocare insieme con il minimo sforzo.

Nota, ammetto che la soluzione di James S è probabilmente più "pura", ma per fare ciò in "one shot" come richiesto, è necessario attendere ASP.NET 4.0 o utilizzare una soluzione simile a quella che troverai nel mio altro post.

Buona fortuna!

Problemi correlati