2010-03-06 3 views
5

Je suis en train de développer l'application dans MVC2 Je veux utiliser mutiple balises de formulaire dans ma demande À mon avis j'ai créé une table qui a l'option Supprimer Ce que je fais par Post pour Individual Delete, j'ai donc créer un tag de formulaire pour chaque bouton. Je veux également que l'utilisateur donne l'option pour supprimer les enregistrements mutiple donc je leur fournit des cases à cocher. Ce formulaire devrait avoir toutes les valeurs des cases à cocher et tous. donc formulaire est rendu comme cePuis-je avoir une balise form intérieur d'une autre dans ASP.net MVC RC2

pour chaque bouton Supprimer

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

Ce qui suit ne fonctionne pas. mais si j'écrire mon code qui rend la forme de cette manière

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

il travaille dans Mozilla mais pas dans IE.I ont debug et les valeurs dans FormCollection En cochés contoller.What faire.?

Répondre

4

Imbrication de forms is not allowed et peut entraîner un comportement indéfini entre les navigateurs.

2

Conceptuellement, une forme dans un formulaire n'a pas vraiment de sens. Ne pouvez-vous pas utiliser les liens d'action à la place des boutons sur les formes intérieures? Vous pouvez toujours les styler pour qu'ils ressemblent à des boutons.

+0

mais en utilisant supprimer avec la méthode get est pas une bonne idée aussi mentionner par 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, c'est un bon point. Dans ce cas, je pense que vous devez prendre une décision qui est la fonctionnalité la plus importante (le moins susceptible d'être manqué si Javascript est désactivé): Supprimer individuellement ou Supprimer sélectionné. Utilisez un (des) formulaire (s) pour le plus important et utilisez Ajax pour l'autre. – pdr

5

En XHTML, un formulaire dans un formulaire n'est pas autorisé et cela n'a pas vraiment de sens.

Pour accomplir ce que vous essayez de faire, vous devez utiliser des liens/boutons simples dans votre tableau. Ceux-ci pourraient, par exemple, envoyer une demande de suppression à votre serveur et, une fois la requête complétée avec succès, supprimer également l'entrée de l'interface utilisateur à l'aide de jQuery.

Exemple:

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

dans la vue

<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*/ 
    } 
}; 

Si vous voulez faire plusieurs supprimer, vous ne devriez pas transférer la liste des ID à supprimer en utilisant l'URL (parce qu'il ya 2k limitation dans IE et il semble méchant), mais plutôt utiliser la syntaxe suivante:

arrayVariable = new Array(); 
// fill array with ids associated to checked checkboxes' entries 
$.post('/Stuff/Delete/' + id, {'IdsToDelete' : arrayVariable }, function(data) { deleteCallback(data); }); return false;"> 

Ceci peut être automatique ally sérialisé à une vraie liste. NET, de sorte que vous aurez juste à itérer la liste des entiers ou des GUID, ou à quoi ressemblent vos PK!

EDIT: Ceci est encore un peu simplifié. Pour des raisons de sécurité, vous devez vous protéger contre CSRF (Cross-Site Request Forgery). Darin fourni a great answer how to do that.

Cela ajoutera le [ValidateAntiForgeryToken] à la méthode de votre contrôleur et la vue devra contenir quelque chose comme

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

merci pour l'autre moyen, mais comment puis-je obtenir suppression unique et mutiple supprimer dans une seule page dans cette situation à la fois en utilisant post. – coolguy97

+0

Pour utiliser la suppression multiple, j'y mettrais des cases à cocher. Vous pouvez vérifier l'état des cases à l'aide de jquery et transmettre la liste des ID que l'utilisateur souhaite supprimer. Les liens à suppression unique restent simplement les mêmes. J'ai mis à jour le poste un peu. – mnemosyn

+0

merci pour la réponse mais je ne veux pas utiliser ajax là – coolguy97

0

Pourquoi ne pas simplement utiliser un seul formulaire et utiliser plusieurs boutons d'envoi? Vous devez interpréter attentivement le résultat, mais cela vous permet de le faire sans javascript et sans avoir à faire de html tordu.

Vous devrez peut-être lire le Request.Params directement, mais c'est assez facile à gérer.

<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

Je pense que cela ne sera pas possible avec post. Depuis l'utilisation de la publication nous pouvons trouver quel bouton de soumission a été cliqué mais ne sera pas capable de trouver la valeur du bouton soumettre si nous voulons afficher une valeur pour montrer l'utilisateur et toute autre valeur que nous voulons soumettre à la base de données.

dans ce cas mon bouton d'envoi est généré Dynamiquement

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