2009-01-02 13 views
9

Mam aplikację, w której potrzebuję użytkownika, aby móc aktualizować lub usuwać wiersze danych z bazy danych. Wiersze są wyświetlane użytkownikowi za pomocą pętli foreach w pliku .aspx mojego widoku. Każdy wiersz będzie miał dwa pola tekstowe (txtName, txtDesc), przycisk aktualizacji i przycisk usuwania. Nie jestem pewien, czy mam przycisk aktualizacji, aby wysłać wiadomość do kontrolera, dla którego wiersza ma zostać zaktualizowany? Mogę zobaczyć kilka sposób to zrobić:Mapowanie poszczególnych przycisków w ASP.NET MVC Wyświetlanie działań kontrolera

  1. umieścić każdy wiersz w zasięgu jego własnym tagu formularza, a następnie po naciśnięciu przycisku aktualizacji kliknięciu złoży wartości dla tego wiersza tylko (nie będzie też ukrytym polem z argumentem rowId), a klasa kontrolera przyjmowałaby wszystkie wartości postów jako parametry do metody Update na kontrolerze.
  2. W pewnym sensie należy napisać skrypt w taki sposób, aby odesłać tylko wartości dla tego wiersza z POST do kontrolera.

Czy jest sposób na zrobienie tego? Obawiam się, że jeśli każdy wiersz ma różne nazwy dla kontrolek przypisanych przez ASP.NET (txtName1, txtDesc1, txtName2, txtDesc2), to w jaki sposób ich wartości zostaną odwzorowane na poprawne parametry metody kontrolera?

+0

Jeśli używasz znacznika przycisku zamiast wejścia, możesz oddzielnie ustawić wartość i wyświetlany tekst, a następnie sprawdzić wartość w kontrolerze. –

Odpowiedz

11

można korzystać z wielu form i ustawić akcję na formularzu być tak:

<form method="post" action="/YourController/YourAction/<%=rowId%>"> 

Więc trzeba będzie YourController/YourAction/1, YourController/YourAction/2 i tak dalej.

Nie trzeba podawać różnych nazw do różnych pól tekstowych, wystarczy je wywołać txtName, txtDesc itd. (Lub jeszcze lepiej, pozbyć się prefiksów txt). Ponieważ są w różnych formach, nie będą się mieszać.

Następnie na działania można zrobić coś podobnego

public ActionResult YourAction(int id, string username, string description) 

Gdzie nazwa, opis są takie same nazwy, które zostały użyte w formie kontroli (więc są mapowane automatycznie). Parametr id zostanie automatycznie zmapowany na numer, który umieściłeś w akcji formularza.

+0

Ta odpowiedź jest poprawna. Dodam, że podczas gdy nazwy elementów mogą i powinny być powtórzone dla każdej formy, każdy element powinien mieć unikalny identyfikator. –

+0

Jeśli używam formantu użytkownika ASP.NET dla każdego wiersza, a w formantu używam pól tekstowych ASP.NET i przycisków, czy możliwe jest wykonanie całej powtarzanej nazwy, unikatowego identyfikatora? – skb

+0

Można również utworzyć prosty przycisk HTML i uzyskać jego wartość na podstawie metody posta kontrolera: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons- in-the-same-form.aspx –

0

Jako że rodbv powiedział, że chcesz użyć oddzielnych elementów <form>.

Podczas korzystania z Asp.Net MVC lub klasycznego html (php, classic asp itp.) Musisz zapomnieć o sposobie obsługi naciśnięć przycisków w Asp.Net. Kiedy formularz jest wysyłany z powrotem do serwera sieciowego, o którym wie każdy serwer, to po prostu "formularz został wysłany i zawiera następujące elementy wejściowe".

Asp.net (standard) dodaje opakowanie dla wielu standardowych działań związanych z ogłaszaniem html przy użyciu javascript (funkcja javascript __doPostback jest używana prawie wszędzie), co dodaje informację o tym, który element wejściowy formularza spowodował odświeżenie i dostarcza go do serwera w ukrytej zmiennej formularza. Możesz naśladować to zachowanie, jeśli naprawdę chcesz, ale polecam przeciw temu.

Może wydawać się dziwne "zaśmiecanie" strony z wieloma <form>, jednak będzie to oznaczać, że oddzwonienie do serwera będzie miało mniejszą wagę i powinno sprawić, że wszystko przebiegnie trochę szybciej dla użytkownika.

4

Można też mieć wiele „valid-o nazwie” przycisków na formularzu, takie jak:

<input type="submit" value="Save" name="btnSave" id="btnSave"/> 
<input type="submit" value="Delete" name="btnDelete" id="btnDelete"/

i nie sprawdzić, co złożyć otrzymaliście. Nie może być tylko jeden złożyć skargę wysłana za formę, tak to jest jak wszystkie inne przyciski przesyłania faktycznie nie istniały w pierwszej kolejności:

if (HttpContext.Request.Form["btnDelete"] != null) { 
    //Delete stuff 
} elseif (HttpContext.Request.Form["btnSave"] != null) { 
    //Update stuff 
} 

Myślę też, że można wdrożyć niestandardowe ActionMethodSelectorAttribute jak tutaj http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx (również wymienione powyżej), aby mieć czystszy oddzielony kod.

Powiązane problemy