2010-03-06 2 views
5

ich derzeit Anwendung in MVC2 Entwicklung am Ich möchte haben mutiple Formular-Tags in meiner Anwendung In My View verwendet ich eine Tabelle erstellt haben, die Option Löschen hat Was mache ich durch Post für einzelne löschen, so dass ich Create Form-Tag für jede Schaltfläche haben. Ich möchte auch Benutzer Option geben, um mehrere Datensätze zu löschen, so dass ich ihnen Kontrollkästchen zur Verfügung stellen. Dieses Formular sollte alle Werte von Kontrollkästchen und alle haben. so erhält FormKann ich habe ein Formular-Tag innerhalb eines anderen in ASP.net MVC RC2

für jede Schaltfläche Löschen

<form action="/Home/MutipleDelete" method="post"> 
<input class="button " name="Compare" type="submit" value="Mutipledelete" style="margin-right:132px;" /> 

<input id="chk1" name="chk1" type="checkbox" value="true" /> 

<form action="/Home/Delete" method="post"> 

    <input type="submit" class="submitLink" value="member1" /> 

    <input type="hidden" name="hfmem1" id="hfmem1" value="1" /> 

       </form> 
<input id="chk2" name="chk2" type="checkbox" value="true" /> 

<form action="/Home/Delete" method="post"> 

    <input type="submit" class="submitLink" value="member2" /> 

    <input type="hidden" name="hfmem2" id="hfmem2" value="2" /> 

       </form> 


      </form> 

Die Gefällt Ihnen dieses machen folgende funktioniert nicht. aber wenn ich meinen Code schreiben macht diese Form auf diese Weise

<form action="/Home/MutipleDelete" method="post"> 

<input class="button " name="Compare" type="submit" value="Mutipledelete" style="margin-right:132px;" /> 
</form> 
<input id="chk1" name="chk1" type="checkbox" value="true" /> 

<form action="/Home/Delete" method="post"> 

    <input type="submit" class="submitLink" value="member1" /> 

    <input type="hidden" name="hfmem1" id="hfmem1" value="1" /> 

       </form> 
<input id="chk2" name="chk2" type="checkbox" value="true" /> 

<form action="/Home/Delete" method="post"> 

    <input type="submit" class="submitLink" value="member2" /> 

    <input type="hidden" name="hfmem2" id="hfmem2" value="2" /> 

       </form> 

es in Mozilla arbeiten, aber nicht in IE.I haben Debug- und Checked Werte in Formcollection In contoller.What zu tun.?

Antwort

4

Verschachtelung von forms is not allowed und kann zu einem undefinierten Verhalten zwischen Browsern führen.

2

Konzeptionell macht eine Form in einer Form keinen Sinn. Können Sie keine Aktionslinks anstelle der Schaltflächen auf den inneren Formularen verwenden? Sie können sie weiterhin so gestalten, dass sie wie Schaltflächen aussehen.

+0

erzeugt, sondern mit get-Methode löschen Verwendung ist keine gute Idee, auch erwähnen, von Stephen walther http://stephenwalther.com/blog/archive/2009/01 /21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx – coolguy97

+1

Ok, das ist ein fairer Punkt. In diesem Fall denke ich, dass Sie eine Entscheidung treffen müssen, welche die wichtigste ist (die am wenigsten übersehen wird, wenn Javascript deaktiviert ist): Löschen einzeln oder Löschen ausgewählt. Verwenden Sie ein Formular für das wichtigste und verwenden Sie Ajax für das andere. – pdr

5

In XHTML ist ein Formular in einer Form nicht erlaubt und es macht nicht wirklich Sinn.

Um zu erreichen, was Sie versuchen, sollten Sie einfache Links/Schaltflächen in Ihrer Tabelle verwenden. Diese könnten beispielsweise eine "Lösch" -Anfrage an Ihren Server senden und bei erfolgreicher Beendigung der Anfrage auch den Eintrag mit jQuery aus der Benutzeroberfläche entfernen.

Beispiel:

[Authorize] 
    [HttpPost] 
    public JsonResult Delete(Guid id) 
    { 
     // do stuff, delete the item 
     return Json(succeeded ? Id.ToString() : "error"); 
    } 

in der Ansicht

<a href="#" onclick="$.post('/Stuff/Delete/' + id, function(data) { deleteCallback(data); }); return false;">delete</a> 

function deleteCallback(data) 
{ 
    if(data=="error"){ 
    /* error handler for UI */ 
    } 
    else { 
    /*remove the entry from the user interface*/ 
    } 
}; 

Wenn Sie mehr löschen tun wollen, sollten Sie nicht die Liste der IDs übertragen (mit der URL zu löschen, weil es eine ist 2k Beschränkung in IE und es sieht böse aus), sondern stattdessen die folgende Syntax verwenden:

Dies kann automatisch sein Zu einer echten .NET-Liste serialisiert, so dass Sie nur eine Liste von Integern oder GUIDs oder wie auch immer Ihre PKs aussehen, durchlaufen müssen!

EDIT: Dies ist immer noch ein bisschen vereinfacht. Aus Sicherheitsgründen sollten Sie sich vor CSRF (Cross-Site Request Forgery) schützen. Darin bereitgestellt a great answer how to do that. Dadurch wird die [ValidateAntiForgeryToken] auf dem Controller-Methode und die Sicht muß enthält etwas wie

var token = $('input[name=__RequestVerificationToken]').val(); 
$.post("/YourUrl", { 'IdsToDelete' : arrayVar, '__RequestVerificationToken': token }, function(data) { deleteCallback(data); }); 
+0

danke für den anderen weg, aber wie kann ich einzelne löschen und mehrere löschen auf einer seite in dieser situation beide post verwenden. – coolguy97

+0

Um Multi-Delete zu verwenden, würde ich dort Checkboxen setzen. Sie können den Status der Kontrollkästchen mit jquery überprüfen und die Liste der IDs übertragen, die der Benutzer löschen möchte. Die Single-Delete Links bleiben dann gleich. Ich habe den Beitrag ein wenig aktualisiert. – mnemosyn

+0

danke für die Antwort, aber ich möchte nicht AJAX dort verwenden – coolguy97

0

Warum nicht einfach ein einziges Formular verwenden und mehr verwenden Senden-Schaltflächen hinzufügen

? Sie müssen das Ergebnis sorgfältig interpretieren, aber das erlaubt Ihnen, dies ohne JavaScript zu tun und ohne verdrehtes HTML zu machen.

Sie müssen die Request.Params direkt lesen, aber das ist relativ einfach genug, damit umzugehen.

<form action="<%= Html.Encode(Url.Action("Delete"))%>"> 
<ul> 
<li>Item 1 <input type="submit" id="<%= IDSafe(item_id) %>" name="<%= IDSafe(item_id2) %>" value="Delete" /></li> 
<li>Item 2 <input type="submit" id="<%= IDSafe(item_id2) %>" name="<%= IDSafe(item_id2) %>" value="Delete" /></li> 
</ul> 
<input type="submit" name="deleteall" value="Delete selected" /> 
</form> 
0

Ich denke, das wird nicht mit Post möglich sein. Seit der Verwendung von Post können wir feststellen, welche Schaltfläche zum Senden ausgewählt wurde, können aber den Wert der Schaltfläche zum Senden nicht finden, wenn wir einen Wert anzeigen möchten, um den Benutzer und anderen Wert anzuzeigen, den wir an die Datenbank senden möchten.

in diesem Fall meine Submit-Button dynamisch

<input type="submit" name="submitbutton" id="<%= Html.Encode(item.ideletevalue) %>" class="submitLink" value=" <%= Html.Encode(item.deleteitemname)%>"/> 
Verwandte Themen