我将使用解决方案来更新此问题,我想包括我的问题和解决方案,因为我无法在Stackoverflow上找到它。如果您想加入解决方案,请放心。
我有一个使用Visual Studio 2013创建的新创建的“空” MVC5项目。如果可能,我需要from并想要AJAX行为。在MVC3中使用Ajax.BeginForm总是很简单,所以我认为在MVC5中也是如此。
但是,当我单击“提交”按钮时,在AjaxOptions中的OnBegin,OnFailure或OnSuccess中指定的所有javascript函数都不会被调用。取而代之的是,将无Ajaxless的帖子发送到服务器,这通过检查Request.IsAjaxRequest返回false来证明是正确的。
我得出的结论是,由于某种原因,根本没有使用ajax。我检查了很多东西,例如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(); }
我检查了有关此问题的其他一些帖子,但找不到解决方案。尽管有人暗示可能的解决方案,但我对Microsoft CDN(http://www.asp.net/ajaxlibrary/cdn.ashx)感到困惑。
在Microsoft CDN上,它们具有以下部分:
以下CD.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。
自从我在布局中包含以下脚本以来,一切都开始起作用:
<script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.min.js"></script>
在Microsoft CDN上,此脚本看起来像是MVC3特定的。
如果可能,请随意提供更好的方法,或者回答以下问题:“为什么此脚本未包含在MVC项目模板(VS2013)中?”