javascript - javascript即使返回false也提交表单
问题描述
我有一个带有外部 URL 和方法 post 的操作的表单
<form name="myform" id="myform" action="externalurl.com" mehtod="post">
</form>
在页面底部,我的 javascript 标签如下所示,在表单提交时,我在控制器中通过 Ajax 调用了 JsonResult。
<script type='text/javascript'>
$('form#myform').submit(function () {
var FirstName = $("#FirstName").val();
var LastName = $("#LastName").val();
$.ajax({
type: "POST",
url: "/umbraco/Surface/CheckoutMain/RegisterUser?FirstName=" + FirstName + "&LastName=" + LastName,
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function (response) {
debugger
if (response == "Yes") {
return true;
}
else if (response == "RequiredFields") {
alert("Please make sure all required fields are filled in.")
return false;
}
else if (response == "No") {
alert(response + "Please contact us!");
return false;
}
}
})
});
</script>
我只是不确定它为什么在我返回对 ajax 调用的响应之前提交。
有什么我做错了吗?
这里还有我控制器中的代码:
[HttpPost]
public JsonResult RegisterUser(string FirstName, string LastName)
{
if (FirstName == "" || LastName == "" )
{
return Json("RequiredFields", JsonRequestBehavior.AllowGet);
}
else
{
return Json("Yes", JsonRequestBehavior.AllowGet);
}
return Json("No", JsonRequestBehavior.AllowGet);
}
此外,如果我返回 No,它仍然会发布,并且如果我在上面的代码中放置断点并逐步执行,我可以看到该站点已经重定向到外部 URL。(我希望这是有道理的)。
如果有人有任何建议,我将不胜感激。
解决方案
您$.ajax
是异步的,因此success
处理程序返回的任何内容都将被忽略;到那时,submit
处理函数将完成(并且将返回undefined
,而不是false
)。
因为你不知道表单是否可以提交,直到响应返回后,你应该return false
不管,然后,如果响应正常,则手动提交表单,否则不要提交表单(并且只显示错误) ):
$('#myform').submit(function() {
var FirstName = $("#FirstName").val();
var LastName = $("#LastName").val();
$.ajax({
type: "POST",
url: "/umbraco/Surface/CheckoutMain/RegisterUser?FirstName=" + FirstName + "&LastName=" + LastName,
dataType: "json",
contentType: "application/json;charset=utf-8",
success: (response) => {
if (response == "Yes") {
this.submit();
} else if (response == "RequiredFields") {
alert("Please make sure all required fields are filled in.")
} else if (response == "No") {
alert(response + "Please contact us!");
}
}
});
return false;
});
您可能还注意到,因为文档中的 ID 是(或应该是)唯一的,所以可以随意使用 ID 选择器 ( '#myform'
),也无需为其添加前缀form
。
推荐阅读
- html - 将 API 数据拉入具有嵌入标签,有没有办法将文本包装在 HTML 标签中?
- angular - 在 Angular 中创建 *with* 功能的动态按钮的正确方法
- code-analysis - 全局抑制 Stylecop 规则不起作用
- php - 选择父母的孩子时如何使父母处于活动状态
- reactjs - NextJS useEffect locaStorage 问题
- web-scraping - 如何从 scrapy 项目创建可执行文件?
- sql-server - 将 bcp 与取自另一列的文件名一起使用
- linux - API/CLI 触发 KVM 动作
- javascript - 使用ajax强制注销时数据库表未更新
- spring-boot - Navigator MediaDevices getUserMedia“权限被拒绝”