2010-10-01 10 views
8

Ich bin ein div mit einer Teilansicht der Aktualisierung durch so etwas wie dies mit:Wie aktualisiert man ein div mit Ajax.BeginForm UND führt eine JavaScript-Funktion aus?

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

und seine adaequat, die zurück Blick auf das div wird appened, aber ich muss jetzt eine Javascript auszuführen, wenn der Beitrag ist erfolgreich, also dachte ich: "einfach, fügen Sie einfach OnSuccess = "MyJsFunc()"" zu der AjaxOptions hinzu, aber nachdem dies getan wurde, hörte es auf zu arbeiten! Jetzt wird die Seite aktualisiert und nur die zurückgegebene Teilansicht gerendert :(, habe ich sogar mit einem einfachen Alert("Hi") versucht und es funktioniert noch nicht .. wie kann ich das zum laufen bringen?

(nebenbei denke ich, dass das sein kann ein dup von https://stackoverflow.com/questions/1994754/execute-javascript-after-loading-a-mvc-page-using-ajax-beginrouteform bekam aber diese Frage ohne Antwort aufgegeben)

+0

+1 zu dieser Frage; Ich glaube, ich habe das gleiche Verhalten selbst gesehen; Verwenden von ASP.NET 4.0 mit MVC2 und C#. Jedes Mal, wenn ich den AjaxOptions einen OnSuccess-Elementwert hinzufüge, scheint sich das Ajax-Formular in ein normales Formular zu verwandeln. Ich habe gerade begonnen, jQuery.form zu verwenden, um solche Formulare jetzt zu senden, aber ich möchte das auch herausfinden! –

+0

Hmm Ich benutze auch ASP.NET 4 und MVC2 und C# –

+0

mögliche Duplikate von [Weisen Sie der AjaxOptions OnSuccess-Eigenschaft eine JavaScript-Funktion zu, die einen Fehler verursacht - ASP.NET MVC] (http://stackoverflow.com/questions/695729/assign-a-jiraskar- function-to) -ajaxoptions-onsuccess-property-raise-a-error-a) – bzlm

Antwort

16

Irgendein Grund dafür, es nicht richtig zu machen (immerhin sind wir 2010)? Dump MS AJAX, wo es zusammen mit allen Ajax.* Helfer, die davon abhängen und schreiben richtigen Code. Während die Verwendung von MS AJAX in klassischen Webforms aufgrund der UpdatePanels gerechtfertigt sein könnte, scheint es heute eine schlechte Idee zu sein, dies in einer neuen ASP.NET MVC-Anwendung zu tun, insbesondere nachdem Microsoft jQuery vollständig angenommen hat.

So nach dem rant hier ist meine Empfehlung:

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

und dann fügen Sie die einreichen Handler unaufdringlich jquery in einer separaten Datei mit:

$(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; 
    }); 
}); 

oder mit dem ausgezeichneten jquery form plugin:

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

Vorteile dieses Ansatzes:

  • Unauffällig
  • Klare Trennung zwischen Markup und JavaScript
  • Caching-JavaScript-Dateien und verringert die Bandbreitennutzung

Bonus profitieren: keine Kopfschmerzen.

+0

Wie kann ich die Modell-ID an die .ajax-Funktion übergeben? –

+0

@Nick Masao, Sie könnten es als verstecktes Feld in das Formular einfügen. –

+0

@Nick Masao, Sie können auch eine "Daten" -Option in den Optionsblock aufnehmen, der an die Ajax-Option übergeben wird. I.E. $ .ajax ({..., Daten: {id: @ Model.id}, ...}); – Brian