2010-10-01 14 views
8

Je suis mettre à jour un div avec une vue partielle en utilisant quelque chose comme ceci:Comment mettre à jour un div avec Ajax.BeginForm ET exécuter une fonction javascript?

<% using (Ajax.BeginForm("Action", "Controller", 
       new { id=Model.id }, 
       new AjaxOptions 
       { 
        UpdateTargetId = "divId", 
        InsertionMode = InsertionMode.InsertAfter, 
       })) 
    { %> 

et son travail bien, la vue retournée s'appened à la div, mais je dois maintenant exécuter un javascript lorsque le poste est réussi, donc j'ai pensé: "facile, il suffit d'ajouter OnSuccess = "MyJsFunc()"" au AjaxOptions, mais après cela, il a cessé de fonctionner! maintenant la page est rafraichie et seule la vue partielle retournée est rendue :(, j'ai même essayé avec un simple Alert("Hi") et son fonctionnement .. comment puis-je faire fonctionner cela?

(par la façon dont je pense que cela peut être un dup de https://stackoverflow.com/questions/1994754/execute-javascript-after-loading-a-mvc-page-using-ajax-beginrouteform mais cette question se sont abandonnés sans réponse)

+0

+1 sur cette question; Je crois avoir vu le même comportement moi-même; en utilisant ASP.NET 4.0 avec MVC2 et C#. Chaque fois que j'ajoute une valeur de membre OnSuccess à AjaxOptions, le formulaire Ajax semble se transformer en un formulaire normal. Je viens de commencer à utiliser jQuery.form pour soumettre de tels formulaires maintenant, mais j'aimerais bien comprendre cela aussi! –

+0

Hmm J'utilise aussi ASP.NET 4 et MVC2 et C# –

+0

duplication possible de [Affecter une fonction Javascript à la propriété AjaxOptions OnSuccess générer une erreur - ASP.NET MVC] (http://stackoverflow.com/questions/695729/assign-a-javascript-function-to -ajaxoptions-onsuccess-propriété-raise-an-error-a) – bzlm

Répondre

16

Une raison de ne pas le faire de la bonne façon (après tout ce que nous sommes en 2010)? Dump MS AJAX où il appartient avec tous les helpers Ajax.* qui en dépendent et écrivent le code approprié. Alors que l'utilisation de MS AJAX dans des formulaires Web classiques aurait pu être justifiée à cause des UpdatePanels, etc ... le faire dans une nouvelle application ASP.NET MVC aujourd'hui, surtout après que Microsoft ait pleinement adopté jQuery, semble être une mauvaise idée.

Ainsi, après la diatribe, voici ma recommandation:

<% using (Html.BeginForm("Action", "Controller", new { id = Model.id }) { %> 

puis attacher le gestionnaire soumettre en utilisant discrètement jquery dans un fichier séparé:

$(function() { 
    $('form').submit(function() { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      success: function(result) { 
       // feel free to execute any code 
       // in the success callback 
       $('#result').html(result); 
      } 
     }); 
     return false; 
    }); 
}); 

ou en utilisant l'excellent jquery form plugin:

$(function() { 
    $('form').ajaxForm(function(result) { 
     // feel free to execute any code 
     // in the success callback 
     $('#result').html(result); 
    }); 
}); 

Avantages de cette approche:

  • Unobtrusive
  • séparation claire entre les balises et javascript
  • fichiers javascript et caching l'utilisation de la bande passante décroissante

avantages Bonus: pas de maux de tête.

+0

Comment puis-je transmettre l'identifiant du modèle à la fonction .ajax? –

+0

@Nick Masao, vous pouvez l'inclure comme champ caché à l'intérieur du formulaire. –

+0

@Nick Masao, vous pouvez également inclure une option 'data' dans le bloc d'options transmis à l'option ajax. C'EST À DIRE. $ .ajax ({..., data: {id: @ Model.id}, ...}); – Brian