好的,我是一个网络新手,但我必须承认我现在已经完全迷上了。这是我的问题:
我有一个包含MVCContrib网格和“添加帐户”链接的页面,该链接显示包含在JQuery对话框中的Ajax表单。当我第一次完成工作流程时,一切都很好。我可以添加一个新项目并通过JQuery / Ajax刷新网格(所以我认为)。但是,当我尝试第二次添加表单时,始终会提交第一个表单中的数据。我一直在看这个问题的时间太长了,必须承认我完全陷入困境。顺便说一句 - 我确定我这样做完全错了所以请随意提出更好的建议。
以下是表格:
@using (Ajax.BeginForm("SaveCheckAccount", "UserManagement", null, new AjaxOptions { OnSuccess = "onAccountAdded", OnFailure = "onAccountAddedFailed"}, new { id = "accountDetails" }))
{
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.version)
@Html.HiddenFor(model => model.User_Id)
@Html.HiddenFor(model => model.IsDefault)
<table>
<tr>
<td>
Account Number
</td>
<td>
@Html.TextBoxFor(model => model.AccountNumber)
@Html.ValidationMessageFor(model => model.AccountNumber, "*")
</td>
</tr>
<tr>
<td>
Routing Number
</td>
<td>
@Html.TextBoxFor(model => model.RoutingNumber)
@Html.ValidationMessageFor(model => model.RoutingNumber, "*")
</td>
</tr>
<tr>
<td>
Account Type
</td>
<td>
@Html.DropDownListFor(model => model.AccountType_Id, new SelectList(@accountTypes, "ID", "Name", Model.AccountType_Id))
@Html.ValidationMessageFor(model => model.CheckAccountType)
@Html.ValidationMessageFor(model => model.AccountType_Id, "*")
</td>
</tr>
<tr>
<td>
Bank Name
</td>
<td>
@Html.TextBoxFor(model => model.BankName)
@Html.ValidationMessageFor(model => model.BankName, "*")
</td>
</tr>
<tr>
<td>
Account Name
</td>
<td>
@Html.TextBoxFor(model => model.AccountName)
@Html.ValidationMessageFor(model => model.AccountName, "*")
</td>
</tr>
</table>
}
<script type="text/javascript">
$.ajaxSetup({ cache: false });
</script>
此javascript位于bank.js文件中
function BindCommands(createUrl) {
$("#modalAdd").live("click", function (e) {
var dialogBox = $("<div>");
e.preventDefault();
$(dialogBox).dialog({
autoOpen: false,
resizable: false,
title: 'Create Account',
modal: true,
show: { effect: "blind", duration: 50 },
hide: { effect: "blind", duration: 50 },
open: function (event, ui) {
$.ajax(
{
type: "Get",
url: createUrl,
success: function (result) {
$(dialogBox).html(result);
}
});
},
buttons: {
Save: function () {
$("#accountDetails").submit();
$(this).dialog('close');
},
Cancel: function () {
$(this).dialog("close");
}
}
});
$(dialogBox).dialog('open');
});
}
function onAccountAdded(data, status, xhr) {
$("#accounts-grid").html(data);
};
function onAccountAddedFailed(data, status, xhr) {
alert("Failed");
};
通过单击此视图上的添加链接初始呈现for:
<script type="text/javascript">
$.ajaxSetup({cache:false});
$(document).ready(function() {
var createUrl = '@Url.Action("NewBankAccountDetails", "UserManagement", new {userId=@Model.Id})';
BindCommands(createUrl);
});
</script>
@if (Model != null && Model.Id > 0)
{
<tr>
<td class="header" colspan="2">
User Accounts
</td>
</tr>
<tr>
<td>
<a href="#" id="modalAdd">Add Account</a>
</td>
</tr>
Html.RenderPartial("_BankAccountGrid", Model.CheckAccounts);
}
答案 0 :(得分:41)
我遇到了同样的问题,并且在我注意到以下脚本被包含两次之前一直撞到了墙上:
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
我在我的包中设置了脚本,视图模板也包含它,这导致了ajax表单的双重帖子。
希望它有所帮助,如果不是双倍的赏金:-P
答案 1 :(得分:0)
我今天也遇到了同样的问题。 Ben的答案为我提供了一个线索,但是我的问题并不像在html源中两次看到jquery.unobtrusive-ajax.js
那样明显。我将几个标准视图转换为部分视图,所以我有一些返回类型为ActionResult
的方法,这些方法使用View
方法来返回ViewResult
的类型:
public ActionResult CreateView()
{
var model = new CreateViewModel();
return View("Create", model);
}
在转换为局部视图的过程中,我制作了一个名为_Create.cshtml
的新.cshtml视图文件,并将controller方法修改为:
public ActionResult CreateView()
{
var model = new CreateViewModel();
return View("_Create", model);
}
这时,我正在_Create部分视图中从ajax表单进行两次发布。解决方案是使用PartialView
方法返回PartialViewResult
的类型:
public ActionResult CreateView()
{
var model = new CreateViewModel();
return PartialView("_Create", model);
}
很难发现,因为除了重复发布ajax表单之外,其他所有东西都工作正常,因为ViewResult
和PartialViewResult
都是ActionResult
的有效类型。
答案 2 :(得分:0)
我知道这是一个非常老的问题,但是今天我遇到了同样的问题。我添加了我现在发现的解决方案,以防其他人遇到此问题。如果要打开创建表单的对话框或页面,则当您关闭该表单(我认为OP正在执行此操作)时,与该表单相关的事件实际上并不会被删除。如果您使用的是jQuery,那么我发现,如果您在实际从DOM中删除表单之前调用$('#form')。remove(),则这些事件将被删除,并且您将不会获得对该动作的多次调用。希望这会有所帮助。