2014-02-17 45 views
15

我將用解決方案更新此問題,我想包括我的問題和解決方案,因爲我無法在Stackoverflow上找到它。如果您想要使用解決方案,請隨時取消。Ajax.BeginForm不會觸發AJAX腳本,在回發時退步

我有一個新創建的使用Visual Studio 2013創建的'Empty'MVC5項目。如果可能,我需要一個來自並想要AJAX行爲。使用Ajax.BeginForm在MVC3中總是很直接,所以我認爲它也會在MVC5中。

但是,當我點擊提交按鈕時,我沒有在OnBegin,OnFailure或AjaxOptions中的OnSuccess中指定的javascript函數被調用。相反,Ajaxless文章被髮送到服務器,通過檢查返回false的Request.IsAjaxRequest,證明這是真實的。

我得出結論,出於某種原因,然後,阿賈克斯根本沒有被使用。我檢查了一些東西,如web.config中,我的佈局腳本等

我的佈局包括以下腳本:

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

我的web.config包括:

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

我的觀點:

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

我的控制器動作(未完成):

[HttpPost] 
public ActionResult Contact(ContactViewModel viewModel, String formName = "") 
    { 
    if (Request.IsAjaxRequest()) 
     { 
     return new EmptyResult();    
     } 

    return new EmptyResult(); 
    } 

我檢查了一些其他帖子在這個問題上,並找不到解決方案。雖然有人暗示可能的解決方案,但我被微軟CDN(http://www.asp.net/ajaxlibrary/cdn.ashx)弄糊塗了。

在Microsoft CDN它們具有以下部分:

下ASP.NET MVC的JavaScript文件均在此CDN託管:

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 

他們似乎暗示你會唯一的腳本需要MVC5的是jquery.validate.unobtrusive。

+0

我想有就行'OnBegin =「OnConactFormBegin()」一個錯字;' –

+0

是的,這是一個錯字,方法應該是OnContactFormBegin。 – Tentux

+0

正如RitchieD使用NuGet指出的那樣,您可以通過獲取適當的庫來輕鬆解決這些問題。如果您遇到像描述的問題,可能是由於缺少庫或正在使用的不兼容庫。 – Tentux

回答

8

一切都已經開始工作,因爲我包含在我的佈局下面的腳本:

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

在Microsoft CDN它看起來好像這個腳本是MVC3特定的。

如果可能,請儘量提供更好的方法,或者回答以下問題:「爲什麼MVC項目模板(VS2013)中未包含此腳本?」

+1

它適用於您,因爲您使用的是過時版本的jQuery。如果你使用MVC 5中包含的jQuery,它將無法工作。由於您包含**的腳本是特定於MVC 3的**。 http://stackoverflow.com/a/15373173/368065 這是適用於MVC 5的解決方案。 – Kikaimaru

+0

我在使用VS.2013創建的解決方案中使用了MVC 5,AJAX與jquery.unobtrusive- ajax。*。js與驗證腳本一起使用。 –

26

爲了得到一個本地副本爲你的MVC項目」 從VS2013,右鍵點擊你的MVC 5項目中,選擇‘管理的NuGet軟件包的一部分。’ 選擇‘網絡’,然後搜索‘jquery.unobtrusive的Ajax’ , 然後安裝「Microsoft.jQuery.Unobtrusive.Ajax」。

+4

然後添加庫

+0

或者鍵入Install-Package將Microsoft.jQuery.Unobtrusive.Ajax包裝到程序包管理器控制檯中。不要忘記引用上面提到的已安裝的腳本。 – Anthony

19

我在虛擬MVC5項目上遇到同樣的問題。

添加到您的BundleConfig

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

添加到您的layout.cshtml

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

我,所以如果你有一個MVC 4或5並沒有任何新的文件添加到我項目web項目,我懷疑你是否需要添加額外的js文件。

它解決了我的問題。我希望它能解決你的問題。

+0

這個工作很好,當你有文件本地,但我很喜歡使用由微軟,jQuery等提供的內容交付網絡。它傳播帶寬的使用,再加上用戶使用本地分佈網絡接近他們的地方,如果很多網站都從同一位置引用相同的腳本,我會假定緩存保存將起作用。 – Tentux

+0

具體而言,我們需要'jquery.unobtrusive-ajax.js'。我需要在Nuget中搜索'Ajax'。 –

+0

這是正確的解決方案,因爲MVC4和5確實在默認情況下添加了這個功能,結果是在頁面中插入了'jquery.unobtrusive-ajax.js'腳本。 – Peter

1

我有同樣的問題和解決竟是以確保腳本引用以正確的順序(具體爲@Scripts.Render("~/bundles/jquery")出現之前@Scripts.Render("~/bundles/jqueryval")

出於某種原因,它不是由默認時喜歡新項目的創建和加入的NuGet包

1

你檢查你的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>