我试图利用jQuery UI (或任何其他对话框插件)来替换默认的确认对话框。例如,在StackOverflow上有许多类似的问题和答案:
jquery dialog: confirm the click on a submit button
然而,在ASP .NET中,我需要更多的东西。
由于约束上的一个表单,在ASP .NET页面上(使用ASP .NET 3.5),可以有多个按钮提交相同的表单,并且基于提交的标题信息,Page知道哪个控件(Button)触发表单提交,并且可以在服务器上调用正确的方法(连接到Button的Click事件的方法)。
例如,如果我使用来自其他StackOverflow答案的解决方案:
buttons: {
'Delete all items': function() {
$(this).dialog('close');
currentForm.submit();
},
'Cancel': function() {
$(this).dialog('close');
}
}
不会在PostBack上调用任何事件处理程序。如果我把它换成:
buttons: {
'Delete all items': function() {
$(this).dialog('close');
$buttonThatWasConfirmed.click();
},
'Cancel': function() {
$(this).dialog('close');
}
}
它将导致无休止的模态对话框递归。如何在ASP .NET中解决这个问题?
发布于 2012-12-24 15:43:47
几个月前我不得不解决这个问题。我想在一个表单上有多个按钮,也许在一个取消按钮上,再加上一个模板中继器,让所有按钮都能正确地要求适当的确认,或者提交表单,或者根据用户的操作取消。以下控件可以在必要时多次包含在窗体上。它继承自System.Web.UI.WebControls.LinkButton
,并使用控件的PostbackEventReference来知道如果确认要提交哪个控件。如果您愿意,该控件可以很容易地从System.Web.UI.WebControls.Button
继承。我选择使用链接按钮,因为它的操作非常像按钮web控件,但不发出<input type=submit>
,如果不使用控件适配器,就不能使用jQuery UI使用图标进行样式化。
/// <summary>
/// A <see cref="T:System.Web.UI.WebControls.LinkButton"/> with added jQuery UI functionality to provide a modal dialog box to cancel the form submit client side.
/// </summary>
/// <remarks>This class requires the inclusion of jQueryUI</remarks>
[DefaultProperty("Text")]
[ToolboxData("<{0}:jQueryUIConfirmedLinkButton runat=\"server\"></{0}:jQueryUIConfirmedLinkButton>")]
public class jQueryUIConfirmedLinkButton : LinkButton
{
/// <summary>
/// Holds the postback event reference data so that the emitted client script can execute the postback if the user confirms the action.
/// </summary>
protected string eventReference = null;
/// <summary>
/// Gets or sets the emitted dialog's ID attribute.
/// </summary>
/// <value>
/// The dialog's ID attribute.
/// </value>
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("dialog")]
[Localizable(true)]
public string DialogCssID
{
get
{
String s = (String)ViewState["DialogCssID"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DialogCssID"] = value;
}
}
internal protected string DialogID
{
get
{
return String.Format("{0}_{1}", this.ClientID, DialogCssID);
}
}
/// <summary>
/// Gets or sets the content of the dialog. This can be plain text or HTML.
/// </summary>
/// <value>
/// The HTML or plain text content of the dialog.
/// </value>
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("<p>Are you sure?</p>")]
[Localizable(true)]
public string DialogContent
{
get
{
String s = (String)ViewState["DialogContent"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DialogContent"] = value;
}
}
/// <summary>
/// Gets or sets the title that will appear on the dialog.
/// </summary>
/// <value>
/// The dialog's title.
/// </value>
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("Confirm Action")]
[Localizable(true)]
public string DialogTitle
{
get
{
String s = (String)ViewState["DialogTitle"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DialogTitle"] = value;
}
}
/// <summary>
/// Gets or sets the text that will appear on the confirmation button.
/// </summary>
/// <value>
/// The text that will appear on dialog's confirmation button.
/// </value>
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("Yes")]
[Localizable(true)]
public string DialogConfirmButtonText
{
get
{
String s = (String)ViewState["DialogConfirmButtonText"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DialogConfirmButtonText"] = value;
}
}
/// <summary>
/// Gets or sets the text that will appear on the dialog's rejection button.
/// </summary>
/// <value>
/// The text that appears on the dialog's rejection button.
/// </value>
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("No")]
[Localizable(true)]
public string DialogRejectButtonText
{
get
{
String s = (String)ViewState["DialogRejectButtonText"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["DialogRejectButtonText"] = value;
}
}
/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. Emits the necessary client script for the control to function.
/// </summary>
/// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.eventReference = Page.ClientScript.GetPostBackEventReference(this, string.Empty);
Page.ClientScript.RegisterStartupScript(this.GetType(), string.Format("{0}{1}", this.ClientID, "-DialogScript"), this.GetClientScript(), true);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), string.Format("{0}{1}", this.ClientID, "-DialogShowScript"), string.Format("function {0}Confirm() {{$('#{0}').dialog('open');}}", this.DialogID), true);
this.OnClientClick = String.Format("{0}Confirm();return false;", this.DialogID);
}
/// <summary>
/// Renders the contents of the control to the specified writer. Adds the dialog HTML container to the output stream.
/// </summary>
/// <param name="writer">A <see cref="T:System.Web.UI.HtmlTextWriter" /> object that represents the output stream to render HTML content on the client.</param>
protected override void RenderContents(HtmlTextWriter writer)
{
base.RenderContents(writer);
writer.AddAttribute("id", this.DialogID);
writer.RenderBeginTag("div");
writer.Write(this.DialogContent);
writer.RenderEndTag();
}
public override void RenderEndTag(HtmlTextWriter writer)
{
base.RenderEndTag(writer);
}
/// <summary>
/// Gets the client script.
/// </summary>
/// <returns>A string that will be output to the client as script</returns>
private string GetClientScript()
{
return string.Format(@"$(function () {{
$('#{0}').dialog({{
autoOpen: false,
modal: true,
resizable: false,
buttons: {{
'{1}': function () {{
$(this).dialog('close');
eval({2});
}},
'{3}': function () {{
$(this).dialog('close');
}}
}},
title: '{4}'
}});
}});", this.DialogID, this.DialogConfirmButtonText, this.eventReference, this.DialogRejectButtonText, this.DialogTitle);
}
}
发布于 2012-10-19 19:31:19
作为选项:在按钮控件中使用SubmitBehavior="false"
,并将脚本放在窗体的结束标记之前:
<script type="text/javascript">
var originalDoPostBack = __doPostBack;
__doPostBack = function (sender, args) {
$("#dialog").dialog({
modal: true,
title: "Confirm action",
buttons: {
Yes: function () {
$(this).dialog("close");
originalDoPostBack(sender, args);
},
Cancel: function () {
$(this).dialog("close");
}
}
});
};
</script>
如果您希望只对特定按钮进行明确的呼叫确认,您可以使用下面的脚本(可能放在标头中)。
function confirmPostBack(sender, args) {
$("#dialog").dialog({
modal: true,
title: "Confirm action",
buttons: {
Yes: function () {
$(this).dialog("close");
__doPostBack(sender.name, args || "");
},
Cancel: function () {
$(this).dialog("close");
}
}
});
return false;
}
<asp:Button runat="server" Text="Click Me" OnClientClick="return confirmPostBack(this)" />
发布于 2012-10-20 00:07:33
我最近使用了这个,虽然它只适用于一个链接按钮。如果你愿意的话,你可以把它们的样式(毕竟它们只是锚)设计成html按钮。
js
$(function () {
$("#confirmMe").click(function (e) {
e.preventDefault();
var $anchor = $(this);
$("<div>Are you sure you want to do that?</div>").dialog({
title: "Confirm",
modal: true,
buttons: {
"Ok": function () {
window.location = $anchor.attr("href");
},
"Cancel": function () {
$(this).dialog("close");
}
}
});
});
});
.net标记(单击“确定”将引发confirmMe_Click事件)
<asp:LinkButton Text="Open Me" runat="server" ID="confirmMe"
ClientIDMode="Static" onclick="confirmMe_Click" />
https://stackoverflow.com/questions/12977827
复制相似问题