在关闭主窗体时,触发服务器事件的对话器

分享于 

9分钟阅读

Web开发

  繁體 雙語

介绍

通常在 ASP.NET 编程时,你想要弹出一个对话框窗口,请求某种用户输入。 当用户完成对话框并关闭它时,你希望主窗体消除执行某种刷新或者它的他操作的服务器事件。 令人惊讶的是,这个任务并不像看起来那么简单,谷歌搜索会发出许多令人困惑的信息。 你可以轻松地编写比你需要的代码更多的代码。 经过一些实验,我觉得我找到了一个完整整洁的方法,从而从不再重新打开和关闭对话框。

本文介绍了一对服务器控件 DialogOpenerDialogCloser,可以快速设置打开。接收用户输入。关闭和激发事件的对话框。

DialogOpener

下面是 DialogOpener 控件的代码:

using System;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;using System.Web;namespace ExWebCtlLib
{
 [DefaultProperty("Text"), ToolboxData("<ExWebCtlLib:DialogOpener 
 runat="server"></WebCtlLib:DialogOpener>")]
 public class DialogOpener : System.Web.UI.WebControls.WebControl, 
 IPostBackEventHandler 
 {
 [Bindable(true)]
 public event EventHandler DialogClosed
 {
 add
 {
 dialogClosed += value;
 }
 remove
 {
 dialogClosed += value;
 }
 }
 private event EventHandler dialogClosed;
 [Bindable(true), Category("Appearance"), DefaultValue("")] 
 public string Text
 {
 get
 {
 return text;
 }
 set
 {
 text = value;
 }
 }
 private string text = "Open Dialog";
 [Bindable(true), Category("Appearance"), DefaultValue("")] 
 public string DialogName
 {
 get
 {
 return dialogname;
 }
 set
 {
 dialogname = value;
 }
 }
 private string dialogname = "Dialog";
 [Bindable(true), Category("Appearance"), DefaultValue(true)] 
 public bool Scrollbars
 {
 get
 {
 return scrollbars;
 }
 set
 {
 scrollbars = value;
 }
 }
 private bool scrollbars = true;
 [Bindable(true), Category("Appearance"), DefaultValue("")] 
 public string DialogPagePath
 {
 get
 {
 return dialogPagePath;
 }
 set
 {
 dialogPagePath = value;
 }
 }
 private string dialogPagePath = "";
 [Bindable(true), Category("Appearance"), DefaultValue("")] 
 public string DialogParam
 {
 get
 {
 if( ViewState[ this.ID + "DialogParam" ] == null )
 return dialogParam;
 else
 return (string)ViewState[ this.ID + "DialogParam" ];
 }
 set
 {
 dialogParam = value;
 ViewState[ this.ID + "DialogParam" ] = value;
 }
 }
 private string dialogParam = "-1";
 protected overridevoid Render(HtmlTextWriter output)
 {
 string url = HttpContext.Current.Request.ApplicationPath + "/" + 
 DialogPagePath + @"?PostBackEventReference=" + 
 Page.Server.UrlEncode( Page.GetPostBackEventReference(this) ).Replace(
 "'", "%27" ) + @"&DialogParam=" + DialogParam;
 string height = Height.Value.ToString();
 string width = Width.Value.ToString();
 string scrollbars = Scrollbars? "yes" : "no";
 output.Write( @"<input id=""ExFxDialogOpener"" type=""button"" 
 value=""" + Text + @""" class=""" + CssClass + @""" 
 onclick=""javascript:OpenDialog('" + url + "', '" + 
 DialogName + "'," + height + "," + width + ", '" + 
 scrollbars + "'" + @" );"">" );
 }
 public void RaisePostBackEvent(string eventArgument)
 {
 if( dialogClosed!= null )
 dialogClosed( this, new EventArgs() );
 }
 }
}

代码很简单,只是一些带有getter和setter的简单属性。 有趣的属性是 DialogClosed 事件属性。 关闭对话框时,此事件将在窗体上激发。 现在看一下URL的构造,特别是 PostBackEventReference 参数。 由控件生成的HTML看起来像这样,具体取决于控件的精确设置:

<inputid="ExFxDialogOpener"type="button"value="Image Gallery"class="Button"onclick="javascript:OpenDialog(
 '/html/Forms/Fx/ImageGallery.aspx?PostBackEventReference=
 __doPostBack(%27_ctl15%24ImageGalleryOpener%27%2c%27%27)
 &DialogParam=SelectImage', 'Dialog', 456, 580, 'yes' );">

PostBackEventReference 作为一个URL参数传递给对话框。 我们将在对话框中使用该信息来关闭关闭服务器事件。

脚本调用JavaScript函数 OpenDialog(...)。 要确保 OpenDialog 脚本在你的页面中,使用 RegisterClientScript 对它的进行 register,或者修改该控件以直接调用 window.open,需要确保该脚本位于你的页面。 下面是 OpenDialog的脚本。

function OpenDialog( url, name, height, width, scrollbars ) 
{
 if( scrollbars == null )
 scrollbars = "yes";
 var top = (screen.height - height)/2;
 var left = (screen.width - width)/2;
 window.open( url, name, "width =" + width + ", 
 height =" + height + ", menubar = no, 
 scrollbars =" + scrollbars + ", toolbar = no, 
 location = no, directories = no, resizable = no, 
 top =" + top + ", left =" + left );

在我们的商店有标准的JavaScript注册模板,所以 OpenDialog 总是可以在页面上使用,这就是为什么它没有包含在 DialogOpener 代码中。 )

DialogCloser

DialogCloser 控件生成必要的JavaScript来关闭对话框,并在主窗体上激发服务器事件。 它通过读取我们在URL中通过 DialogOpener 传递的PostBackEventReference 并构建所需的JavaScript来实现这一。

下面是 DialogCloser的代码:

publicclass DialogCloser : System.Web.UI.WebControls.WebControl
{
 publicvoid Close()
 {
 if( HttpContext.Current.Request[ "PostBackEventReference" ] == null )
 Page.RegisterStartupScript("__close", "<script>window.close();</script>"); 
 else
 {
 string script = String.Format("<script>window.opener.{0}; 
 window.close();</script>", HttpContext.Current.Request[ 
 "PostBackEventReference" ] );
 Page.RegisterStartupScript( "__close", script ); 
 }
 }
}

下面是在调用 DialogCloser.Close 时注册的JavaScript的一个示例:

<script>
 window.opener.__doPostBack('_ctl15$ImageGalleryOpener',''); 
 window.close();
</script>

编译控件

要编译这些控件,只需在自己的服务器控件库中创建几个新的服务器控件类。 如果没有服务器控件库,请创建"类库"类型的新项目,编译,然后右击工具箱,单击添加/删除. dll。 单击"确定",并且两个控件将出现在你的工具箱中。

使用控件

使用这些控件很容易。 创建两个aspx页。其中一个是主窗体,另一个是对话框。 将 DialogOpener 放置到主窗体上并打开属性表。 将 DialogPagePath 属性设置为对话框页的路径和名称。 双击 DialogClosed 事件并编写对话框关闭时要运行的代码。

DialogCloser 控件放置到对话框窗体上。 如果希望对话框关闭,请在对话框代码中的某个位置,编写以下行:

DialogCloser.close();

运行主窗体单击DialogOpener按钮。 关闭对话框将在主窗体上调用 DialogClosed 事件,并且你的事件处理器代码将运行。

结束语

这篇短文展示了如何创建一对有用的服务器控件,以便在对话框关闭时对对话框打开和关闭服务器事件。 我希望这能帮你找到一些像我这样的答案 !


Server  for  form  EVE  event  MAIN  
相关文章