2010-02-13 7 views
2

Je suis en train d'utiliser le lien pour soumettre un formulaire en utilisant le code suivant:ASP.NET MVC formulaire à l'aide ActionLink Soumission

function deleteItem(formId) { 

      // submit the form 

      $("#" + formId).submit(); 

     } 

Fondamentalement, j'ai une grille et il affiche un certain nombre d'éléments. Chaque ligne a un bouton de suppression qui supprime l'élément. Je tire ensuite la fonction suivante pour retirer l'élément de la grille.

function onItemDeleted(name) { 

      $("#" + name).remove();      

     } 

Il fonctionne très bien lorsque j'utilise un bouton d'envoi, mais lorsque j'utilise le lien d'action le JavaScript de l'action du contrôleur est retourné sous forme de chaîne et non exécutée.

public JavaScriptResult DeleteItem(string name) 
     { 
      var isAjaxRequest = Request.IsAjaxRequest(); 

      _stockService.Delete(name); 
      var script = String.Format("onItemDeleted('{0}')", name); 
      return JavaScript(script); 
     } 

Et voici le code HTML:

<td> 

    <% using (Ajax.BeginForm("DeleteItem",null, new AjaxOptions() { LoadingElementId = "divLoading", UpdateTargetId = "divDisplay" },new { id="form_"+stock.Name })) 
     { %> 

    <%=Html.Hidden("name", stock.Name)%> 
    <a id="link_delete" href="#" onclick="deleteItem('form_ABC')">Delete</a> 

    <% } %> 

    </td> 

Ma théorie est que le bouton soumettre ne modifie la réponse alors que le lien d'action renvoie simplement tout ce qui est de retour de l'action du contrôleur. Cela signifie que lorsque vous utilisez submit, le JavaScript est ajouté à la réponse, puis exécuté alors qu'en cas de lien d'action, il est simplement renvoyé sous forme de chaîne.

Si tel est le cas, comment quelqu'un peut-il utiliser des liens d'action au lieu de soumettre des boutons.

MISE À JOUR:

On dirait que je dois faire quelque chose en plus pour faire le lien d'action pour travailler car il ne se déclenche pas l'événement onsubmit.

http://www.devproconnections.com/article/aspnet22/posting-forms-the-ajax-way-in-asp-net-mvc.aspx

+0

Je suggère de l'essayer sans helpers Html? Je m'inquiète; MVC se transforme lentement en jumeau maléfique de Webforms. – ziya

+0

HtmlHelpers pour quoi faire? J'utilise le lien sans HtmlHelpers. – azamsharp

Répondre

1

Je pense est la forme MS Ajax sait comment gérer un JavaScriptResponse et exécuter le code alors que votre Le vieux lien Action simple, sans relation avec l'AjaxForm, ne l'est pas. Je suis assez sûr que la bibliothèque MS ajax essentiellement eval() s la réponse quand il voit le type de contenu de javascript renvoyé.

Étant donné que vous n'avez pas de rappel dans votre méthode deleteItem(), le script n'a pas de place. Pour corriger, vous devrez manuellement eval() la chaîne renvoyée qui est considérée comme une mauvaise pratique. Maintenant, je ne suis pas familier avec la bibliothèque MS Ajax pour être certain de tout cela, mais ce que vous faites est possible. Je ferais les choses différemment mais je ne veux pas répondre avec une approche «mon chemin est meilleur» (surtout parce que votre blog m'a déjà aidé) mais j'aimerais montrer que cela peut être plus facile.

Je abandonnerais complètement le formulaire et utiliserais javascript discret pour obtenir le comportement que vous voulez. EN psuedo jqueryish (ne sais pas ms ajax) Code:

function bindMyGrid() { 
    $('.myDeleteLink').onclicksyntax(function() { 

     //find the td in the row which contains the name and get the text 
     var nameTdCell = this.findThisCellSibling(); 

     //do an ajax request to your controller 
     ajax('myUrl/' + nameTdCell.text(), function onSuccessCallback() { 

       //get the tr row of the name cell and remove it 
       nameTdCell.parent().remove();     
     }); 

    }); 
} 

Cette gagne également l'avantage de ne pas javascript retour de votre contrôleur que certains considèrent briser le modèle MVC et des préoccupations seperation. J'espère que mon code de psuedo aide.

+1

J'ai fini par utiliser la fonction $ .get de JQuery pour effectuer la requête Ajax. – azamsharp

0

Essayez sans la propriété UpdateTargetId dans les AjaxOptions (ne pas préciser)

new AjaxOptions() { LoadingElementId = "divLoading" } 
+0

Consultez la publication mise à jour. – azamsharp

0

Qu'en est-il du simple changement de look d'un standard ou de l'utilisation d'une classe css? Cela ressemblera à un lien et vous éviterez quelques problèmes avec les ancres - l'utilisateur pourra cliquer dessus avec une molette de la souris et ouvrir ce lien dans un nouvel onglet/fenêtre.

Questions connexes