2009-07-09 20 views
5

Mam zmodyfikowano aplikację Nerd Dinner umożliwiający edycję rekordów podrzędnych dodając następujący kod do DinnerForm.ascxAktualizacja Rodzic/dziecko Records z modelowych spoiw w 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> 

jest to renderowania:

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

Nie zmodyfikowałem metody edycji akcji DinnersControler. Kolacja rodzica jest aktualizowana, jak zwykle, ale pojawia się UpdateModel (kolacja); nie wyświetla/aktualizuje rekordów RSVP dziecka.

Próbowałem kilka wariantów renderowania rekordów podrzędnych, aby segregatory modelu zobaczyły kolekcję bez powodzenia.

Aktualizuje zapisy rodzica/dziecka w jednym ujęciu przez wywołanie funkcji UpdateModel (Parent); możliwe z obecnymi modelami segregatorów?

Odpowiedz

4

Ja sam nie byłem w stanie tego zrobić.

Wiem, że można zaktualizować pojedynczy element podrzędny, np. Dinner.RSV automatycznie. Nigdy nie widziałem możliwości aktualizowania elementu potomnego, co wymagałoby powiązania, aby wiedzieć, która właściwość jest identyfikatorem i szukać jej (np. Dinner.RSVP.Where (r => r.RSVP_ID == input_id), a następnie zaktualizuj to). Nie wiem wystarczająco dużo o wiązaniu niestandardowym, aby zrobić coś takiego.

Jednak to, co mam zrobić, to zrobić pętlę i określ RSVP i int jako przedrostek:

więc zrobić:

UpdateModel("Dinner", Dinner); 

zaktualizować rodzica, a następnie:

int i = 0; 

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

Nie tak czyste, ale działa dobrze dla mnie. Może jednak zająć trochę więcej wysiłku, aby zbudować walidację (jednak chcesz sprawdzić wszystkie jednocześnie i upewnić się, że nie powrócisz do widoku na pierwszym RSVP z błędem).

EDIT: Naprawiono kod odzwierciedlający rozwiązanie OP, w tym błąd w mojej kolejności parametrów. Mówiąc to, jestem bardziej komfortowy przy użyciu właściwości RSVP.ID niż liczba całkowita. Tak długo, jak wiesz, że Dinner.RSVP będą takie same na POST jak GET (jestem pewien tego w moim kodzie), wtedy użycie RSVP.ID będzie działać. Jeśli RSVP będą różne, wtedy tylko ci obecni na obu zostaną zaktualizowani. Jednak użycie sekwencji int może potencjalnie spowodować zaktualizowanie niewłaściwego obiektu.

nadzieję, że pomoże, James

+0

@jamesshannon Ta odpowiedź jest bliska. Popraw model aktualizacji w pętli, aby przeczytać int i = 0; foreach (RSVP r in Dinner.RSVPs) { UpdateModel (r, "Dinner.RSVPs [" + i + "]"); i ++; } i możemy oznaczyć to zrobić/odpowiedzieć. –

0

Dobrze, więc nikt nie odpowiada. Nie znam aplikacji nerddinner, ale był zainteresowany twoim problemem. Miał nadzieję na odpowiedź, ale cóż, jeszcze nie. Nie jest w 100% pewne z powodu braku znajomości ndinnera, ale czy może być powiązane z this post, gdzie wspomina o wiązaniu/aktualizacji tylko wtedy, gdy właściwość została jawnie przekazana?

0

Twoje pytanie jest czy aktualizowanie ewidencji rodzic/dziecko w jednym strzale przez wywołanie UpdateModel (Parent); możliwe z obecnymi modelami segregatorów?

Tak, jest to możliwe.Jednak jest możliwe , a nie (bez kilku pomniejszych obejść), jeśli używasz Linq-to-Sql i twoje obiekty podrzędne są eksponowane poprzez EntitySet<T> zamiast czegoś podobnego do IList<T>. Wierzę, że to będzie (zostało?) Rozwiązane w następnej wersji MVC z powodu ASP.NET 4.0. Na razie jednak domyślny segregator modelu MVC wydaje się nie rozumieć sposobu pracy z EntitySet.

Proszę spojrzeć na to other answer Napisałem na pokrewne pytanie jakiś czas temu, ze szczegółami o tym, jak mam teraz do czynienia (pracuję) w tej sytuacji w pewnych prostych przypadkach. Robiąc to, musiałem przestać martwić się o to, jak "idealne" to rozwiązanie jest z punktu widzenia DDD/OOP, jako kompromis, aby po prostu sprawić, że MVC i LTS będą ładnie grać razem przy minimalnym wysiłku.

Uwaga, muszę przyznać, że rozwiązanie Jamesa S jest prawdopodobnie bardziej "czyste", ale aby zrobić to w "jednym ujęciu", gdy pytasz, musisz albo poczekać na ASP.NET 4.0, albo użyć obejście podobne do tego, co znajdziesz w moim drugim poście.

Powodzenia!