2017-03-31 50 views
2

我有一個用戶控件,有一個GridView,當用戶點擊這個GridView中的一行時,函數OnSelectedIndexChanged被調用,我想在這種情況發生後彈出一個模式。我使用ScriptManager來調用腳本$('#seasonInfoModal').modal(),它在打開模式中工作。問題是,打開在同一用戶控件中定義的模式時,它不起作用。模式在page.aspx內部時打開,但在控制內部時不打開.ascx。我已經把所有東西都正確地連接起來,並省略了一些細節。這裏是整個代碼是什麼樣子在gridview行點擊打開模態

主要page.aspx

<%@ Page Title="" Language="C#" ... %> 
<%@ Register Src="~/Controls/MyControl.ascx" TagPrefix="ACT" TagName="GeneralADM" %> 

<ACT:GeneralADM runat="server"" /> 

MyControl.ascx

<%@ Language="C#" AutoWireUP="true" Codebehind="" Inherits="" %> 

<div runat="server"> 

    <!-- Seasonal Info--> 
    <div runat="server" id="seasonInfoModal" class="modal fade" role="dialog" draggable="true"> 
    </div> 
    <!-- End seasonal info--> 

    <!-- Start of Season Edit Modal --> 
    <div id="seasonEditInfo" class="modal fade" role="dialog" draggable="false"> 
    </div> 
    <!-- End of Season Edit Modal --> 

     <asp:GridView> 
     </asp:GridView> 

</div> 

在後面的代碼我嘗試打開該模式是這樣

MyControl。 ascx.cs

protected void OnSelectedIndexChanged(object sender, GridViewEventArgs e){ 
    ScriptManager.RegisterStartupScript(this, 
     this.GetType(), 
     "seasonInfoModal", 
     "$('#seasonInfoModal').modal();", 
     true); 
} 

問題

#seasonInfoModal不會彈出,而是彈出一個新的模式,其中沒有任何內容,屏幕會在點擊時變暗。當我將#seasonInfoModal從控件中拉出到插入控件本身的頁面時,實際上彈出了模式。

問題

我怎樣才能打開模態#seasonInfoModal當它從該控件的代碼隱藏控制內專門從裏面OnSelectedIndexChanged功能?

+0

你真的*需要*從服務器端打開彈出窗口嗎?你真的需要UpdatePanel嗎?他們只是把事情弄得一團糟。 – mason

+0

@mason我需要弄清楚如何在用戶控件中打開模式。 –

+0

問題是沒有提供任何類型的信息,即正在使用哪種模式對話框,沒有關於正在嘗試打開模式的事件的詳細信息。 – kaushalparik27

回答

3

問題可能是由ASP.NET執行的ID mangling造成的。由於模式div是一個服務器控件(如runat="server"所指定),因此在呈現的HTML中其ID不是seasonInfoModal,而是類似MyControl1_seasonInfoModal。因此,Javascript選擇器$('#seasonInfoModal')找不到它。

您可以更改啓動腳本代碼,並seasonInfoModal.ClientID的值傳遞給jQuery選擇,以解決ID的mangling:

protected void OnSelectedIndexChanged(object sender, GridViewEventArgs e){ 
    ScriptManager.RegisterStartupScript(this, 
     this.GetType(), 
     "seasonInfoModal", 
     string.Format("$('#{0}').modal();", seasonInfoModal.ClientID), 
     true); 
} 

其他辦法,以避免ID的mangling是:

  1. 要刪除runat="server"屬性,如果你不需要訪問div控件代碼隱藏
  2. 爲了廣告d clientidmode="static"到div。
  3. 使用類名(使用相應的jQuery類選擇器)而不是模態div的ID。

但是,如果用戶控件的幾個實例存在於表單中,這3種解決方案將無法正確運行。第一個實例的模式將始終使用,在情況1和2中,表單的多個控件將具有相同的ID。

+0

只是想知道。會將clientidmode =「static」屬性添加到元素中以實現相同的操作? @<! - 季節性信息 - >

<! - 結束季節性信息 - >' –

+0

@LuisEstevez - 它會有和我最後兩條建議一樣的問題,但它也可以。我會將它添加到「替代品」列表中。謝謝。 (我沒有提到它,因爲出於某種原因,intellisense似乎並不知道它是否適用於我的VS編輯器中的服務器div控件)。 – ConnorsFan