我对ASP.NET MVC中的模态寡妇有一些奇怪的问题。我创建了一个链接,负责显示模态窗口。模态窗口显示并包含一个按钮 - 保存按钮。我将click事件处理程序附加到此按钮以保存窗口的内容然后将其关闭。整个机制看起来就是这样
// this link shows up a modal window
@Html.ActionLink("Add", "Add", "Index", null, new { id = "actionLinkAdd" });
and javaScript
$(function () {
debugger;
$("#actionLinkAdd").on("click", function (event, action) { // attaching to click event
debugger;
event.preventDefault(); //disabling default handler
var $dialog = $('<div></div>');
var $url = $(this).attr('href');
$dialog.empty();
var $kendoWindow = $dialog.kendoWindow({ //window creating
height: "200px",
title: "Dodaj",
visible: false,
width: "200px",
actions: ["Close"],
content: $url // loading of the window's content (partialView)
}).data("kendoWindow");
$kendoWindow.center();
$kendoWindow.open();
function onButtonSaveClick(event) {
debugger;
event.preventDefault();
var $url = $('#target').attr("action");
$.ajax({
url: $url,
type: "POST",
data: $('#target').serialize(),
success: function (response) {
$("#btnSave").unbind("click");
$kendoWindow.close();
$kendoWindow.destroy();
},
error: function (args) {
debugger;
$("#btnSave").unbind("click");
$kendoWindow.content(args.responseText);
}
});
}
$('#btnSave').live("click", onButtonSaveClick); // attaching to click event on save button in the modal window
});
});
一切都很有效。问题是onButtonClick()函数被激活了几次。例如,如果我打开模态窗口两次,这个函数也会被调用两次。这对我来说很奇怪,因为我关闭模态窗口,销毁它甚至取消绑定附加到btnSave的所有点击事件(我也尝试使用开启和关闭功能,但窗口的行为是相同的)。这种行为可能是什么原因?
答案 0 :(得分:4)
甚至更好地移动绑定事件的线:
}
$('#btnSave').live("click", onButtonSaveClick);
});
});
这样下来一行:
}
});
$('#btnSave').live("click", onButtonSaveClick);
});
问题在于,每次创建新对话框时都会调用直播,但无法使用“解除绑定”解除绑定。但是你不需要,你只需在页面就绪时调用的最外层函数中使用live一次绑定,然后它将获取任何id ='btnSave'的任何单击。现在你不应该真正创建多个具有相同id的元素的对话框窗口,你应该把类设置为'btnSave',但这是另一个故事..
答案 1 :(得分:2)
答案 2 :(得分:1)
我发现,为了在模态窗口上进行验证,我在模态对话框中包含了一个包,如下所示:
@Scripts.Render("~/bundles/jqueryval")
我这样做是因为验证包仅在父页面上加载时验证失败。
我的jqueryval包包含三个文件:
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.unobtrusive*", // references two jquery libraries
"~/Scripts/jquery.validate*"));
我发现包含此捆绑包导致了多次触发问题,可能是因为每次调用模式对话框时库都会加载并保留在内存中。当我删除捆绑包时,问题就消失了,但验证也没有发生。
经过大量的实验,我终于找到了解决方案;拆分捆绑包,将两个jquery库移动到父页面,将第三个移动到模型对话框。具体地说...
父页面上的这两个:
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
和模态对话框中的这个:
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
随着包含的分离,我不再需要多次解雇,也保留了验证。