【发布时间】:2015-03-16 13:20:33
【问题描述】:
我正在尝试使用弹出窗口调用 JavaScript 函数,如果用户单击“确定”,它会调用 C# 函数。但是页面总是在我加载 JavaScript 函数的同时回发。
我的 HTML ASP:按钮:
<asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="<%$ Resources:Resource, WebEDI_Save %>" OnClick="PrchBtn_Click" OnClientClick = "Confirm();" />
OnClientClick,它调用这个JS函数:
function Confirm() {
var confirm_value = document.createElement("INPUT");
confirm_value.type = "hidden";
confirm_value.name = "confirm_value";
alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
if (e) {
confirm_value.value = "Yes";
} else {
confirm_value.value = "No";
}
document.forms[0].appendChild(confirm_value);
});
}
然后是我的 C# 函数:
public void PrchBtn_Click(object sender, EventArgs e)
{
//Code here...
}
它使用一个简单的“确认”对话框。但我想自定义弹出窗口,这就是我使用“Alertify”库的原因。
感谢您的帮助。
更新(参见 cmets #3): 通过点击此链接 (Call Code Behind Function from JavaScript (not AJAX!)) 这是我的实际代码:
<asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="<%$ Resources:Resource, WebEDI_Save %>" OnClientClick="Confirm(); return false;" />
<asp:Button runat="server" ID="PrchBtnHidden" ClientIDMode="Static" OnClick="PrchBtn_Click" style="display:none;" />
function Confirm() {
var confirm_value = document.createElement("INPUT");
confirm_value.type = "hidden";
confirm_value.name = "confirm_value";
alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
if (e) {
confirm_value.value = "Yes";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
} else {
confirm_value.value = "No";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
}
});
}
但问题是一样的,JS 和 C# 是同时做事的。
更新(奖励错误): 我不知道为什么,但我的 alertify 被窃听了。 提示:
alertify.prompt("Message", function (e, str) {
// str is the input text
if (e) {
Console.Log("Ok");
} else {
Console.Log("No");
}
}, "Default Value");
当我点击 Ok 或 No 时,什么都没有触发。而提示的TextBox内容为:
function (e, str) { // str 是输入文本 if (e) { Console.Log("Ok"); } else { Console.Log("No"); } }
并带有 Alertify.Confirm
alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
if (e) {
confirm_value.value = "Yes";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
} else {
confirm_value.value = "No";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
}
});
只有“确定”在触发。取消按钮没有任何作用。
解决方案: 又拿了一个 alertify.js (http://alertifyjs.com/) 这是我的 JS 函数:
alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function () {
confirm_value.value = "Yes";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
},
function () {
confirm_value.value = "No";
document.forms[0].appendChild(confirm_value);
__doPostBack('<%= PrchBtnHidden.UniqueID %>');
}).set('labels', { ok: 'Ok', cancel: 'No' });
它有效!
【问题讨论】:
-
这会很棘手。由于您的
Confirm()函数在其执行结束时不知道是否取消回发,因此您需要在那里阻止回发,然后在您的alertify的事件处理程序中手动触发回发.或者,如果我是你,我会借此机会消除回发并将其替换为对 Web API 的 AJAX 调用。 -
有简单的方法吗?我试着只调用 JS 并在按钮上返回 false。然后在我的 JS 函数中,它会调用一个 C# 方法。但问题是这个方法需要是静态的......
-
请参阅this question 上接受的答案,了解如何从 JS 触发回发并针对特定的 C# 事件处理程序。
-
我用新的尝试更新了我的第一篇文章(使用您的链接)。但也不工作。 ://
-
您需要从您的
Confirm()函数中return false;以防止在该函数完成时发生回发。
标签: javascript c# asp.net alertify