【发布时间】:2014-03-16 21:20:08
【问题描述】:
我将使用解决方案更新此问题,我想包含我的问题和解决方案,因为我无法在 Stackoverflow 上找到它。如果您想加入解决方案,请随意。
我有一个使用 Visual Studio 2013 创建的新创建的“空”MVC5 项目。如果可能,我需要一个 from 并且想要 AJAX 行为。在 MVC3 中使用 Ajax.BeginForm 总是很简单,所以我认为在 MVC5 中也可以。
但是,当我单击提交按钮时,我在 AjaxOptions 内的 OnBegin、OnFailure 或 OnSuccess 中指定的任何 javascript 函数都不会被调用。而是将 Ajaxless 帖子发送到服务器,通过检查返回 false 的 Request.IsAjaxRequest 证明这是真的。
我得出的结论是,由于某种原因,根本没有使用 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 上有以下部分:
以下 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。
【问题讨论】:
-
我猜
OnBegin = "OnConactFormBegin()";线上有错字 -
是的,这是一个错字,方法应该是 OnContactFormBegin。
-
正如 RitchieD 所指出的,通过使用 NuGet,您可以通过获取适当的库轻松克服这些问题。如果您遇到上述问题,可能是由于缺少库或使用了不兼容的库。
标签: ajax asp.net-mvc-5