@Aventus:
Wysyłasz na widok model np. Order, który zawiera List<OrderItem>, który zawiera np. Guid i nazwę.
Na widoku masz formularz, który poza informacjami dot. order zawiera naszą listę OrderItem
, a dokładnie jej abstrakcję
Taki pseudo kod:
@foreach (var item in @Model.OrderItems)
{
<div class="entry_container" id="@item.Id"> // pojemnik na cały wiersz
<input type="hidden" name="MyOrderIDsArray[]" value="@item.Id"/> // wystarczy [] - nie trzeba pilnować indexów.
<input readonly value="@item.Title"/> // jakiś napis
<button type="button" onclick="remove_div('@item.Id')"; // button do usuwania z listy (type=button aby nie submitnął)
</div>
}
js:
function remove_div(guid)
{
document.getElementById(guid).Remove(); czy coś
}
Gdy wyślę ten formularz, to te wpisy dot. name="MyOrderIDsArray[]"
z wartościami value="@item.Id"
, które nadal są w DOMie zostaną wysłane jako np. List<Guid> do kontrolera, a te które usunąłeś z DOMa javaskryptem nie zostaną.
Później już pozostaje etap wyczyszczenia i przypisania tych OrderItems, które zostały wysłane do kontrolera - List<Guid>
np. order.OrderItems.Clear()
i dodawanie 1 by 1 z bazy o Id z listy.
Oczywiście tą fazę nadpisywania wypadałoby jakoś lepiej zrobić + jakieś zabezpieczenia.
Drugie podejście, akurat teraz wpadłem na to:
Można też pójść w drugą stronę i zapisywać tylko te Guidy, które usunąłeś i wysłać listę tych, które chcesz usunąć z kolekcji :)
Zatem:
Masz jeden widok, na którym możesz usuwać (i dodawać, ale to trochę więcej trzeba zrobić) dynamicznie (więc fajnie od strony usera) i zapisujesz wszystko na raz.