2009-01-02 5 views
9

Ich habe eine Anwendung, in der ich den Benutzer in der Lage sein muss, Zeilen von Daten aus der Datenbank zu aktualisieren oder zu löschen. Die Zeilen werden dem Benutzer mithilfe einer foreach-Schleife in der ASPX-Datei meiner Ansicht angezeigt. Jede Zeile enthält zwei Textfelder (txtName, txtDesc), eine Aktualisierungsschaltfläche und eine Löschschaltfläche. Worüber ich mir nicht sicher bin, ist, wie ich den Aktualisierungsbutton die Nachricht an den Controller senden lasse, für welche Zeile er aktualisiert werden soll? Ich kann ein paar Weg, dies sehen:Zuordnung einzelner Schaltflächen auf ASP.NET MVC View zu Controller-Aktionen

  1. jede Zeile Legen Sie innerhalb seines eigenen Form-Tages, dann, wenn die Update-Schaltfläche geklickt wird, wird es nur die Werte für diese Zeile einreichen (es wird auch ein verstecktes Feld sein mit der rowId) und die Controller-Klasse würde alle Post-Werte als Parameter für die Update-Methode auf dem Controller übernehmen.
  2. Irgendwie muss der Knopf in einer Weise skripted werden, um nur die Werte für diese Reihe mit einem POST zum Controller zurückzusenden.

Gibt es eine Möglichkeit, dies zu tun? Eine Sache, um die es mir geht, ist, ob jede Zeile unterschiedliche Namen für die von ASP.NET zugewiesenen Steuerelemente hat (txtName1, txtDesc1, txtName2, txtDesc2). Wie werden dann ihre Werte den richtigen Parametern der Controller-Methode zugeordnet?

+0

Wenn Sie die Schaltfläche Tag anstelle der Eingabe verwenden, können Sie den Wert und den Anzeigetext getrennt einstellen und dann den Wert im Controller überprüfen. –

Antwort

11

können Sie mehrere Formulare verwenden, und stellen Sie die Aktion auf dem Formular so sein:

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

So werden Sie YourController/YourAction/1 haben, YourController/YourAction/2 und so weiter.

Es gibt keine Notwendigkeit, den verschiedenen Textfeldern unterschiedliche Namen zu geben, nennen Sie sie einfach txtName, txtDesc usw. (oder besser, entfernen Sie diese txt Präfixe). Da sie in verschiedenen Formen sind, werden sie nicht verwechseln.

Dann auf der Aktion machen Sie so etwas wie

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

Wo Benutzername, Beschreibung die gleichen Namen sind, die Sie auf dem Formular-Steuerelemente verwendet (so werden sie automatisch abgebildet). Der ID-Parameter wird automatisch der Nummer zugeordnet, die Sie der Formularaktion zugewiesen haben.

+0

Diese Antwort ist korrekt. Ich würde hinzufügen, dass, während die Elementnamen für jedes Formular wiederholt werden können und sollten, jedes Element eine eindeutige ID haben sollte. –

+0

Wenn ich für jede Zeile ein ASP.NET-Benutzersteuerelement verwende und in der Steuerung ASP.NET-Textfelder und -Buttons verwende, ist es möglich, den gesamten wiederholten Namen, eindeutige ID-Sache zu tun? – skb

+0

Oder Sie können auch eine einfache HTML-Schaltfläche erstellen und ihren Wert auf Controller-Post-Methode erhalten: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-button- in-der-selben-form.aspx –

0

Als rodbv sagte, dass Sie separate <form> Elemente verwenden möchten.

Wenn Sie Asp.Net MVC oder klassisches HTML (PHP, klassische Asp, etc) verwenden, müssen Sie die Asp.Net Art der Handhabung von Tasten drücken vergessen. Wenn ein Formular an den Webserver zurückgesendet wird, weiß der Server nur "das Formular wurde gesendet und enthielt die folgenden Eingabeelemente".

Asp.net (Standard) fügt einen Wrapper um viele der Standard-HTML-Postback-Aktionen mit Javascript (die JavaScript-Funktion __doPostback wird fast überall verwendet) und dies fügt Informationen darüber, welche Eingabeelement des Formulars verursacht das Postback und liefert es auf den Server in einer versteckten Form Variable. Sie könnten dieses Verhalten nachahmen, wenn Sie es wirklich wollten, aber ich würde es eher empfehlen.

Es mag merkwürdig erscheinen, dass eine Seite mit vielen <form> 'verschmutzt' wird, aber es wird bedeuten, dass das Postback auf den Server leichter wird und alles für den Benutzer etwas schneller laufen lassen sollte.

4

Sie können auch mehrere „valid Namen“ Tasten auf der Form wie haben:

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

und als zu überprüfen, um zu sehen, was einreichen Sie erhalten haben. Es kann nur einen geben Aktion pro Formular gesendet einreichen, so ist es wie alle anderen Tasten einreichen eigentlich nicht in erster Linie bestanden:

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

Ich denke auch, dass Sie http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx eine benutzerdefinierte ActionMethodSelectorAttribute wie hier umsetzen können (auch oben aufgeführt), um einen saubereren Code zu erhalten.

Verwandte Themen