在MVC5中使用Ajax异步提交表单时:Ajax.BeginForm不执行的问题总结,其实是对JQuery不熟悉,以及不仔细分析,给自己一个总结教训吧(网上冲浪查了很多解决思路和案例,结合多解决方案才解决)
Ajax提交的表单
@using (Ajax.BeginForm("ProcessLogin", "UserLogin", new AjaxOptions() { OnSuccess = "afterLogin" }))
处理成功方法JS
function afterLogin(data) {
if (data == "ok") {
window.location.href = "/Home/index";
} else {
alert(data);
changeCheckCode();//验证码或用户名密码错误就重新生成一个验证码
}
}
Controller中的Action
public ActionResult ProcessLogin()
{
string InputCode = Request["vCode"];
string SessionCode = Session["VCode"] as string;
Session["VCode"] = null;
//解决Session失效的问题
if (SessionCode == null)
{
return Content("验证码不能为空");
}
string name = Request["LoginCode"];
string pwd = Request["LoginPwd"];
if (InputCode != SessionCode)
{
return Content("验证码不正确");
}
short DelNormal = (short)SDK.Study.Net.Demo.Test.Enum.DelFlagEnum.Normal;
var userInfo = UserInfoBll.GetEntites(u => u.UName == name && u.Pwd == pwd && u.DelFlag == DelNormal).FirstOrDefault();
if (userInfo == null)
{
return Content("未找到用户信息");
}
Session["LoginUser"] = userInfo;
return Content("ok");
}
大家也看到了,其实到目前看上面的代码没有任何的问题,谁能想到引用JS文件也是有很大讲究的
- 第一个问题,引用顺序错误,jquery.unobtrusive-ajax.js这个文件是依赖jquery-1.10.2.min.js的,这里顺序错误,前端会提示xxxx is not defind,这里总记的是所有的JS文件应该都是依赖JQuery的,
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
修改为
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
- 解决第一个问题,现在又发现第二问题,JQuery的版本问题,看了介绍说jquery.unobtrusive-ajax.js中的live方法在1.7后就不在被JQuery支持了,更改为on的使用方式了,这里我将JQuery降版本处理了,重新引用JQuery1.7版本
修改为
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
至此问题得到解决
原文1 JQuery顺序问题
原文2 版本问题解决