我不确定发生了什么。奇怪的是,这曾经起作用,突然之间就被打破了。我不认为这是jQuery的一个突破,因为我的不引人注目的验证工作得很好。如果我在控制器上设置了断点,我就不会在按下按钮时到达它。
<div class="signup-wrapper">
<h3>Register to get updates and contest details</h3>
@using (Ajax.BeginForm("EmailList", "Account", new AjaxOptions
{
UpdateTargetId = "signup-wrapper",
InsertionMode = InsertionMode.Replace,
HttpMethod = "Post"
}))
{
@Html.AntiForgeryToken()
@Html.LabelFor(P => P.FirstName)
<br />
@Html.TextBoxFor(P => P.FirstName)
<br />
@Html.LabelFor(P => P.LastName)
<br />
@Html.TextBoxFor(P => P.LastName)
<br />
@Html.LabelFor(P => P.Email)
<br />
@Html.TextBoxFor(P => P.Email)
<br />
@Html.ValidationMessageFor(P => P.Email)
<br />
@Html.LabelFor(P => P.EmailConfirmation)
<br />
@Html.TextBoxFor(P => P.EmailConfirmation)
<br />
@Html.ValidationMessageFor(P => P.EmailConfirmation)
<br />
<input type="submit" value="Go!" />
}
</div>
控制器代码
[ValidateAntiForgeryToken]
[AllowAnonymous]
[HttpPost]
public ActionResult EmailList(GarageViewModels.EmailListSignUpViewModel vM)
{
if (ModelState.IsValid)
{
using (var context = new JDMExchangeEntities())
{
context.EmailLists.Add(vM.ReturnModel());
context.SaveChanges();
ViewBag.IsSignedUp = true;
return PartialView("EmailSignUpConfirmation");
}
}
return View("Index");
}
有人看到任何明显的东西吗?我打开了chrome工具,看到请求实时发生,我所能看到的只是验证jquery发出请求,但无论我点击提交多少次,我都不会看到任何类型的请求被发送。
Layout.Mobile
<head>
<meta name="viewport" content="width=device-width" />
<title>Modded JDM Cars</title>
<link href="@Url.Content("~/Content/swipe_style.css")" rel="stylesheet" type="text/css" />
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryval")
<script src="~/Scripts/modernizr-2.5.3.js"></script>
<script src="~/Scripts/swipe.js"></script>
捆绑注册
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
"~/Scripts/jquery-ui-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.unobtrusive*",
"~/Scripts/jquery.validate*"));
第一步
我检查了Google Chrome中的网络标签,看到发送到服务器的请求,看到我的jQuery验证工作正常但出于某种原因,当我按下提交按钮时,我从未向控制器发送过请求。根据第二条评论,我用一些jquery拦截了表单提交,并发出警报以确保帖子确实正在通过。肯定是。
第二步
既然我知道帖子正在发送但我的控制器没有收到,我认为这可能是我的viewmodel中的编码问题,因为如果有错误,ajax请求似乎无声地失败。在发布请求之前,我使用远程处理发出了一个Get请求,以便仔细检查是否存在任何现有的电子邮件。我为其添加了[AllowAnonymous]
和[HttpGet]
属性并再次进行了测试。
[AllowAnonymous]
[HttpGet]
public JsonResult IsEmailUnique(string Email)
{
using (var context = new JDMExchangeEntities())
{
var item = context.EmailLists.SingleOrDefault(P => P.Email == Email);
if (item == null)
return Json(true, JsonRequestBehavior.AllowGet);
else
return Json("Email is already registered.", JsonRequestBehavior.AllowGet);
}
}
似乎我的webapp在这部分代码中失败了。在第一个Get请求失败后,以下POST请求也将失败。现在帖子有效,但在下一次更新中提交了两次以上。
答案 0 :(得分:0)
问题的初始问题已经解决,并作为问题本身的更新而写下来。最后一个问题涉及将ajax发送两次到服务器。事实证明这是我正在使用的捆绑包。我认为可能有一个重复的<script src="~/Scripts/jquery-1.7.1.min.js"></script>
,因为小提琴手将这段javascript作为帖子的来源。我删除了捆绑包并简单地使用了
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery-ui-1.8.20.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
代替。这解决了发送的重复帖子。