Javascript .submit(函数())在我的模式弹出窗口中不起作用,我的模式弹出窗口将发送正常的http post请求
我正在开发一个asp.net mvc web应用程序。在我的主视图中,我得到了以下创建链接:-Javascript .submit(函数())在我的模式弹出窗口中不起作用,我的模式弹出窗口将发送正常的http post请求,javascript,jquery,ajax,asp.net-mvc,razor,Javascript,Jquery,Ajax,Asp.net Mvc,Razor,我正在开发一个asp.net mvc web应用程序。在我的主视图中,我得到了以下创建链接:- <a class="btn btn-success" data-modal="" href="/Staff/Create" id="btnCreate"> <span class="glyphicon glyphicon-plus"></span> </a> <!-- modal placeholder--&
<a class="btn btn-success" data-modal="" href="/Staff/Create" id="btnCreate">
<span class="glyphicon glyphicon-plus"></span>
</a>
<!-- modal placeholder-->
<div id='myModal' class='modal fade in'>
<div class="modal-dialog">
<div class="modal-content">
<div id='myModalContent'></div>
</div>
</div>
</div>
现在,当我单击“创建”链接时,创建操作方法将返回以下局部视图,该视图将在模式弹出窗口中呈现:-
@model SkillManagement.Models.Staff
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Staff</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.GUID, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.GUID)
@Html.ValidationMessageFor(model => model.GUID)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.IsExternal, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.IsExternal)
@Html.ValidationMessageFor(model => model.IsExternal)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.FirstName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
</div>
//code goes here
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
@model SkillManagement.Models.Staff
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
工作人员
@Html.ValidationSummary(true)
@LabelFor(model=>model.GUID,新的{@class=“controllabel col-md-2”})
@EditorFor(model=>model.GUID)
@Html.ValidationMessageFor(model=>model.GUID)
@LabelFor(model=>model.UserName,新的{@class=“controllabel col-md-2”})
@EditorFor(model=>model.UserName)
@Html.ValidationMessageFor(model=>model.UserName)
@LabelFor(model=>model.IsExternal,新的{@class=“controllabel col-md-2”})
@EditorFor(model=>model.IsExternal)
@Html.ValidationMessageFor(model=>model.IsExternal)
@LabelFor(model=>model.FirstName,新的{@class=“controllabel col-md-2”})
@EditorFor(model=>model.FirstName)
@Html.ValidationMessageFor(model=>model.FirstName)
//代码在这里
}
到目前为止,我的每件事都很好地工作,Get Create action方法将被调用,部分视图将在一个模式弹出窗口中呈现
但是现在在我的局部视图中,如果我单击“Create”按钮,将调用Post-Create操作方法,但不是因为javascript代码。当我检查Post create action方法中的Request.IsAjax()
时,我发现它不是一个ajax请求,这意味着部分视图发送的是一个正常的Post http,而不是脚本中定义的ajax请求,有人能告诉我当前方法的错误吗?
谢谢您正在通过ajax将表单加载到页面中,但是您正在加载的表单是一个常规html表单。如果您希望表单本身使用ajax,我相信您正在寻找
@ajax.BeginForm()
如您所见,只需将
#myModalContent
节点传递给bindForm
函数,jQuery选择器就会查找
// will never find #myModalContent
$('#myModalContent', myModalContentDOMElement).submit(function () {
相反,你应该这样做
$('form', dialog).submit(function (e) {
e.preventDefault(); // stop the default form submit action
您似乎没有取消默认提交(
return false;
位于else
块中,该块可能无法调用)。尝试$('#myModalContent',dialog).submit(函数(e){e.preventDefault();…
@StephenMuecke,但我遵循的方法与此链接中提到的完全相同,当我下载项目时,我发现脚本将能够发送ajax请求,而无需添加e.preventDefault()?你能告诉我吗?为什么在我的情况下这不起作用?除了链接代码(本文第2部分)在脚本末尾有返回false,所以它总是被调用-你在else
块中有它,所以它只有在表单无效时才被调用(因此,如果它有效,它将发出一个ajax调用,并且正常的submit-返回false
,这将阻止从未调用标准submit)@ StephenMuecke,我开始感觉到我在这个链接上遵循了一个错误的例子,当我面对问题时,你认为链接上的方法是有效的吗?因为我将呈现一个包含HTML的部分视图。Beginform(不是Ajax。然后我将强制Html.Beginform发送一个ajax请求,而不是普通的http请求,我不确定这种方法是否有效?返回false
(或者如上所述的e.preventDefault()
)应该会阻止标准表单提交,所以不确定发生了什么。代码中有一些奇怪的事情(可能与您的问题无关)例如,带有id=“myModalContent”
的元素是一个
的元素,它没有.submit
事件,因此我认为$('myModalContent',dialog)。submit(函数(){..
应该是$(dialog)。submit(函数(){..
(假设dialog
是
元素),我真的不明白为什么要调用bindForm();
在else
块中。我的原始代码如您所述,但由于在我的主索引视图中,我已经有了一个搜索表单,因此我的jQuery代码似乎会在我的主视图中选择表单,而不是在模式弹出窗口中选择表单。因此,我必须显式地提到表单id…您能再见吗?@johnG$('form',dialog)
正是按照您所说的,在对话框/modalContent中选择表单。这不会像您所说的那样从索引视图中选择表单。另外,您需要阻止默认操作,请检查我的编辑。@johnG好吧,因为(我猜)$('form')
将返回一个所选元素的数组,其中没有valid()
method。如果($(this.valid()),您将执行如下操作
。我不是.net
开发人员,尽管这对于任何语言都是完全有效的方法。如果真的有帮助,您介意将此标记为答案吗?@johnG基本上都会/应该生成几乎相同的标记,我想,但是Ajax.beginfound
可能有自己的JavaScript绑定来修改表单g的行为/方式ets已提交,这实际上是您在JavaScript代码中提交的。希望这有意义。但我发现了这个实现类似功能的链接。您能同意吗?是的,我知道使用Ajax.Beginform是为了发送Ajax post请求而构建的,但我是
// will never find #myModalContent
$('#myModalContent', myModalContentDOMElement).submit(function () {
$('form', dialog).submit(function (e) {
e.preventDefault(); // stop the default form submit action