在一些應用中,希望將模式對話框的值回送(PostBack)到服務端,也就是執行一個服務端操作,從而刷新頁面。
舉個例子:比方說新建一個訂單,此時希望能在模式對話框中選擇產品,並將產品的ID返回,同時刷新訂單中的產品項,解決的方法有多種,這裏只介紹執行服務器操作的方法。
要將客戶端數據回送(PostBack)到服務端並執行相應操作,顯然必須提交form並設置隱藏域__EVENTTARGET的值,好在asp.net已爲我們完成了這些,只要以合適的參數調用__doPostBack就可以了。
另一個問題是如何把模式對話框的值也傳過服務端,這個就好說了,有多種方法,在這裏用一個隱藏域來保存值,當然這個隱藏域必須加上runat="server"屬性。
下面給出部分代碼:
主頁面TestDialog.aspx:
<input type="hidden" id="txtValue" runat="server"/>
<br/>
<asp:LinkButton id="lbtnOpen" runat="server" text="打開對話框"/>
<br/>
對話框返回值:<asp:TextBox id="txtValue2" runat="server"/>
</form>
主頁面後置文件TestDiallg.aspx.cs:
StringBuilder sb = new StringBuilder();
if ( ! IsClientScriptBlockRegistered( "clientScript" ) ) {
sb.Append( "<script language='javascript'>\n" )
.Append( " function addproduct() { \n" )
.Append( " var ret = window.showModalDialog( 'test2.aspx' ); \n" )
.Append( " if ( ret != undefined ) { \n" )
.Append( " document.getElementById('" + txtValue.ClientID + "').value = ret \n" )
.Append( " __doPastBack('" + lbtnOpen.UniqueID + "', '');\n" )
.Append( " } \n" )
.Append( " }\n " )
.Append( "</script>\n" );
RegisterClientScriptBlock( "clientScript", sb.ToString() );
}
lbtnOpen.Attributes.Add( "onClick", "javascript:addproduct();" );
}
private void lbtnOpen_Click( object Sender, EventArgs e ) {
txtValue2.Text = txtValue.Value;
}
private void InitializeComponent()
{
this.Load += new EventHandler( this.Page_Load );
this.lbtnOpen.Click += new EventHandler( this.lbtnOpen_Click );
}
對話框頁面test2.aspx:
<asp:TextBox id="txtValue" runat="server"/>
<br/>
<input type="button" id="hlnkOk" value="確定" runat="server"/>
</form>
對話框頁面後置文件Test2.aspx.cs
StringBuilder sb = new StringBuilder();
if ( ! IsClientScriptBlockRegistered( "clientScript" ) ) {
sb.Append( "<script language='javascript'>\n" )
.Append( " function closedialog() { \n" )
.Append( " window.returnValue = document.getElementById('" + txtValue.ClientID + "').value;\n" )
.Append( " window.close();\n" )
.Append( " }\n " )
.Append( "</script>\n" );
RegisterClientScriptBlock( "clientScript", sb.ToString() );
}
hlnkOk.Attributes.Add( "onClick", "javascript:closedialog();" );
}