2009-07-09 9 views
5

Ich habe die Nerd Dinner Anwendung modifiziert Bearbeitung von untergeordneten Datensätzen zu ermöglichen, indem Sie den folgenden Code in das DinnerForm.ascx ZugabeAktualisierung Eltern-/Kind-Datensätze mit Modell Binder 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> 

es rendert diese:

<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> 

Ich habe die Post-Edit-Action-Methode von DinnersControler nicht geändert. Das Elternessen wird wie gewohnt aktualisiert, aber es erscheint das UpdateModel (Abendessen); Die untergeordneten RSVP-Datensätze werden nicht angezeigt/aktualisiert.

Ich habe ein paar Variationen beim Rendern der untergeordneten Datensätze versucht, so dass die Modellbinder die Sammlung sehen werden, ohne Glück.

Aktualisieren Eltern/Kind-Datensätze in einer Aufnahme durch den Aufruf UpdateModel (Parent); möglich mit den aktuellen Modellbindern?

Antwort

4

Ich konnte das nicht selbst tun.

Ich weiß, dass Sie ein einzelnes Kind Element, dh Dinner.RSV automatisch aktualisieren können. Ich habe noch nie die Fähigkeit gesehen, ein untergeordnetes Kind zu aktualisieren, was die Bindung erfordern würde, um zu wissen, welche Eigenschaft die ID ist und danach zu suchen (zB Dinner.RSVP.Where (r => r.RSVP_ID == input_id) und dann update das). Ich weiß nicht genug über benutzerdefinierte Bindung, um so etwas zu tun.

Doch was ich getan habe, ist eine Schleife zu tun und das uAwg und die int als Präfix angeben:

So tun Sie:

UpdateModel("Dinner", Dinner); 

die Eltern zu aktualisieren und dann:

Nicht ganz so sauber, aber es funktioniert gut für mich. Es kann jedoch etwas aufwändiger sein, die Validierung zu erstellen (Sie möchten alle gleichzeitig validieren und sicherstellen, dass Sie nicht mit einem Fehler zur Ansicht des ersten RSVP zurückspringen).

BEARBEITEN: Der Code wurde korrigiert, um die OP-Lösung widerzuspiegeln, einschließlich eines Fehlers in meiner Parameterreihenfolge. Nachdem das gesagt ist, bin ich wohler mit der Eigenschaft RSVP.ID als eine laufende Ganzzahl. Solange Sie wissen, dass Dinner.RSVPs auf dem POST das gleiche wie das GET sein werden (davon bin ich in meinem Code überzeugt), wird die Verwendung von RSVP.ID funktionieren. Sollten sich RSVPs unterscheiden, werden nur die auf beiden vorhandenen aktualisiert. Die Verwendung des sequenziellen int könnte jedoch möglicherweise dazu führen, dass das falsche Objekt aktualisiert wird.

Hoffnung, dass James

+0

@jamesshannon Diese Antwort ist in der Nähe. Fixiere dein Update-Modell in der Schleife, um zu lesen int i = 0; foreach (RSVP r in Dinner.RSVPs) { UpdateModel (r, "Dinner.RSVPs [" + i + "]"); i ++; } und wir können dies als erledigt/beantwortet markieren. –

0

Ok, also niemand antwortet. Ich kenne die Nerddinner-App nicht, war aber an deinem Problem interessiert. Hoffte, einige Antworten zu sehen, aber, nun, noch keine. Nicht 100% sicher, weil es nicht vertraut mit ndinner ist, aber könnte es mit this post in Verbindung gebracht werden, wo sie das Binden/Aktualisieren nur dann erwähnen, wenn eine Eigenschaft explizit übergeben wird?

0

Ihre Frage hilft, ist, ob die Aktualisierung Eltern/Kind-Aufzeichnungen in einem Schuss von Update Aufruf (Parent); möglich mit den aktuellen Modellbindern?

Ja, das ist möglich.Es ist jedoch nicht möglich (ohne einige kleinere Problemumgehungen), wenn Sie Linq-zu-Sql verwenden und Ihre untergeordneten Objekte werden über EntitySet<T> anstelle von etwas wie IList<T> ausgesetzt. Ich glaube, das wird in der nächsten Version von MVC, die mit ASP.NET 4.0 veröffentlicht wird, angesprochen. Momentan scheint die MVC-Standardmodellmappe jedoch nicht zu verstehen, wie mit EntitySet zu arbeiten ist.

Bitte beachten Sie diese other answer Ich schrieb vor einiger Zeit auf eine verwandte Frage, mit Details darüber, wie ich jetzt in bestimmten einfachen Fällen mit dieser Situation umgehen (arbeiten). Dabei musste ich aufhören, mir Gedanken darüber zu machen, wie "ideal" diese Lösung aus einer DDD/OOP-Perspektive ist, als ein Kompromiss, MVC und LTS einfach mit minimalem Aufwand zusammen zu spielen.

Hinweis, ich gebe zu, dass James S Lösung ist wahrscheinlich "reiner", aber um dies in "One-Shot" zu tun, wie Sie fragen, müssen Sie entweder auf ASP.NET 4.0 warten, oder verwenden ein ähnlicher Workaround wie in meinem anderen Beitrag.

Viel Glück!