2014-02-17 6 views
15

Ich werde dieses Problem mit der Lösung aktualisieren, ich wollte mein Problem und Lösung, wie ich es nicht auf Stackoverflow finden konnte. Wenn Sie mit der Lösung einsteigen wollen, fühlen Sie sich frei.Ajax.BeginForm nicht AJAX-Skript, fällt zurück auf Postback

Ich habe ein neu erstellt 'Empty' MVC5-Projekt mit Visual Studio 2013 erstellt. Ich brauchte ein von und wollte AJAX-Verhalten, wenn möglich. Die Verwendung von Ajax.BeginForm war in MVC3 immer einfach, also dachte ich, es wäre auch in MVC5.

Allerdings wird keine der JavaScript-Funktionen, die ich in OnBegin, OnFailure oder OnSuccess innerhalb der AjaxOptions angegeben habe, aufgerufen, wenn ich auf die Schaltfläche zum Senden klicke. Stattdessen wird ein Ajaxless-Post an den Server gesendet. Dies hat sich als wahr erwiesen, indem Request.IsAjaxRequest geprüft wurde, das false zurückgibt.

Ich habe festgestellt, dass aus irgendeinem Grund, Ajax überhaupt nicht verwendet wird. Ich habe eine Reihe von Dingen wie web.config, mein Layout Skripte überprüft usw.

Mein Layout umfasst die folgenden Skripten:

<script src="~/Scripts/jquery-1.5.1.min.js"></script> 
<script src="~/Scripts/jquery.validate.min.js"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

Meine web.config enthält:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 
</configuration> 

Meine Ansicht:

@model ContactEnquiryViewModel 

@{ 
AjaxOptions ContactOptions = new AjaxOptions() 
{ 
    OnBegin = "OnConactFormBegin()",  
    OnSuccess = "OnContactFormSuccess()", 
    OnFailure = "OnContactFormFailure()" 
    }; 
} 

<div id="EnquiryFormContainer"> 

@using (Ajax.BeginForm("Contact", "Home", new { formName = "EnquiryForm" }, ContactOptions)) 
    { 
    @Html.HiddenFor(m => m.Subject) 

    <div class="field"> 
     @Html.LabelFor(m => m.FirstName) 
     @Html.TextBoxFor(m => m.FirstName) 
     <div class="validation"> 
      @Html.ValidationMessageFor(m => m.FirstName) 
     </div> 
    </div> 

    <div class="field"> 
     @Html.LabelFor(m => m.LastName) 
     @Html.TextBoxFor(m => m.LastName) 
     <div class="validation"> 
      @Html.ValidationMessageFor(m => m.LastName) 
     </div> 
    </div> 

    <div class="field"> 
     @Html.LabelFor(m => m.Email) 
     @Html.TextBoxFor(m => m.Email) 
     <div class="validation"> 
      @Html.ValidationMessageFor(m => m.Email) 
     </div> 
    </div> 

    <div class="field"> 
     @Html.LabelFor(m => m.PhoneNumber) 
     @Html.TextBoxFor(m => m.PhoneNumber) 
     <div class="validation"> 
      @Html.ValidationMessageFor(m => m.PhoneNumber) 
     </div> 
    </div> 

    <div class="field"> 
     @Html.LabelFor(m => m.Comments) 
     @Html.TextAreaFor(m => m.Comments) 
     <div class="validation"> 
      @Html.ValidationMessageFor(m => m.Comments) 
     </div> 
    </div> 

    <div id="submitButtonContainer"> 
     <input type="submit" value="Submit" name="submit" /> 
    </div> 
    } 
</div> 

Meine Controller-Aktion (unvollendet):

Ich habe einige andere Beiträge zu diesem Problem überprüft und konnte keine Lösung finden. Obwohl einige auf die mögliche Lösung hindeuteten, wurde ich von Microsoft CDN (http://www.asp.net/ajaxlibrary/cdn.ashx) verwirrt.

auf dem Microsoft CDN sie den folgenden Abschnitt haben:

Die folgenden ASP.NET MVC JavaScript-Dateien auf dieser CDN gehostet werden:

ASP.NET MVC 5.0 

http://ajax.aspnetcdn.com/ajax/mvc/5.0/jquery.validate.unobtrusive.js 
http://ajax.aspnetcdn.com/ajax/mvc/5.0/jquery.validate.unobtrusive.min.js 

ASP.NET MVC 4.0 

http://ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.js 
http://ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js 

ASP.NET MVC 3.0 

http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.js 
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.min.js 
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js 
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js 
http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.js 
http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.debug.js 

ASP.NET MVC 2.0 

http://ajax.aspnetcdn.com/ajax/mvc/2.0/MicrosoftMvcAjax.js 
http://ajax.aspnetcdn.com/ajax/mvc/2.0/MicrosoftMvcAjax.debug.js 

ASP.NET MVC 1.0 

http://ajax.aspnetcdn.com/ajax/mvc/1.0/MicrosoftMvcAjax.js 
http://ajax.aspnetcdn.com/ajax/mvc/1.0/MicrosoftMvcAjax.debug.js 

Sie würden scheinen das einzige Skript vorschlagen, dass Sie werde Notwendigkeit für MVC5 ist jquery.validate.unobtrusive.

+0

enthält ich denke, es ist ein Tippfehler auf der Linie 'OnBegin =„OnConactFormBegin()“;' –

+0

Ja, das war ein Tippfehler, Methode sollte OnContactFormBegin sein. – Tentux

+0

Wie RitchieD mit NuGet gezeigt hat, können Sie diese Probleme leicht lösen, indem Sie die entsprechenden Bibliotheken abrufen. Wenn ein Problem wie das beschriebene auftritt, liegt dies wahrscheinlich an fehlenden Bibliotheken oder inkompatiblen Bibliotheken. – Tentux

Antwort

8

Alles hat damit begonnen, das folgende Skript in meinem Layout, da ich mit der Arbeit eingeschlossen:

<script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.min.js"></script> 

auf dem Microsoft CDN sieht es aus, als ob dieses Skript MVC3 spezifisch.

Fühlen Sie sich frei, bessere Möglichkeiten beizutragen, wenn möglich, oder beantworten Sie die Frage: "Warum ist dieses Skript nicht in der MVC-Projektvorlage (VS2013) enthalten?"

+1

Es funktioniert für Sie, weil Sie eine veraltete Version von jQuery verwenden. Wenn Sie jQuery in MVC 5 verwenden würden, würde es nicht funktionieren. Da das Skript, das du eingibst ** ist MVC 3 spezifisch **. http://stackoverflow.com/a/15373173/368065 Dies ist eine richtige Lösung für MVC 5. – Kikaimaru

+0

Ich verwende MVC 5 mit jQuery 1.10 in einer mit VS.2013 und AJAX mit jquery.unobtrusive- ajax. *. js zusammen mit den Validierungsskripten. –

26

Um eine lokale Kopie als Teil Ihrer MVC-Projekt“ Von VS2013 der rechten Maustaste auf Ihre MVC 5 Projekt, wählen Sie‚erhalten verwalten NuGet Packages‘. Wählen Sie‚Online‘und die Suche nach‚jquery.unobtrusive-ajax‘ , Dann installieren Sie "Microsoft.jQuery.Unobtrusive.Ajax".

+4

Fügen Sie dann die Bibliothek hinzu

+0

Geben Sie alternativ Install-Package Microsoft.jQuery.Unobtrusive.Ajax in die Paketmanagerkonsole ein. Vergessen Sie nicht, das installierte Skript wie oben erwähnt zu referenzieren. – Anthony

19

Ich hatte das gleiche Problem auf einem Dummy-MVC5-Projekt.

Fügen Sie diese auf Ihre BundleConfig

 bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
        "~/Scripts/jquery.unobtrusive*", 
        "~/Scripts/jquery.validate*")); 

Fügen Sie diese auf Ihre layout.cshtml

@Scripts.Render("~/bundles/jqueryval") 

werden keine neuen Dateien zu meinen Projekten hinzufügen, haben also, wenn Sie ein MVC 4 oder 5 haben Web-Projekt, ich bezweifle, wenn Sie zusätzliche js-Dateien hinzufügen müssten.

Es löste mein Problem. Ich hoffe es löst deine.

+0

Und das funktioniert gut, wenn Sie die Dateien lokal haben, aber ich mag die Verwendung von Content Delivery Networks von Microsoft, jQuery, etc. Es verteilt die Bandbreitennutzung, und Benutzer können lokale Distributionsnetzwerke in der Nähe ihrer Lokalität verwenden, und wenn viele Websites dasselbe Skript vom selben Ort referenzieren, würde ich annehmen, dass das Speichern im Caching ins Spiel kommt. – Tentux

+0

Spezifisch brauchen wir 'jquery.unobtrusive-ajax.js'. Ich musste Nuget nach 'Ajax' suchen. –

+0

Dies ist die richtige Lösung, da MVC4 und 5 dies standardmäßig hinzufügen und der Effekt ist, dass das Skript 'jquery.unobtrusive-ajax.js' in die Seite eingefügt wird. – Peter

1

hatte ich das gleiche Problem und die Lösung war eigentlich sicher zu stellen, dass die Skriptverweise in der richtigen Reihenfolge sind (genauer gesagt, dass @Scripts.Render("~/bundles/jquery") erscheint vor @Scripts.Render("~/bundles/jqueryval"))

Aus irgendeinem Grunde war es wie es standardmäßig nicht, wenn das neue Projekt zu erstellen und das Hinzufügen der nuget Pakete

1

Haben überprüfen Sie, ob Ihre Datei web.config

<appSettings> 
    <!-- this one is for client side validation --> 
    <add key="ClientValidationEnabled" value="true" /> 

    <!-- this is for unobtrusive ajax --> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 
Verwandte Themen