2017-03-31 14 views
2

私はGridViewのユーザーコントロールを持っています。このGridViewの行をユーザーがクリックすると、OnSelectedIndexChangedという関数が呼び出されます。この後にモーダルがポップアップされます。 ScriptManagerを使用して、モーダルを開く際に機能するスクリプト$('#seasonInfoModal').modal()を呼び出しました。問題は、同じユーザーコントロール内で定義されたモーダルを開くときに機能しないことです。モーダルはpage.aspxの内側にあるときに開きますが、コントロールの内側にあるときは開きません.ascx。私はすべてが正しく結びついていて、いくつかの詳細を省いています。ここで私はこのgridview行のモーダルを開く

MyControlと同様にモーダルを開こうとすると背後に全体のコードはコードで

メイン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> 

次のようになります。 ascx.cs

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

#seasonInfoModal代わりにポップアップ表示されず、内部に何も入れずに新しいモーダルが作成され、クリックすると画面が暗くなります。 #seasonInfoModalをコントロールから外して、コントロール自体を挿入するページに移動すると、モーダルが実際にポップアップします。それはそのコントロールの分離コードから、具体的OnSelectedIndexChanged関数内からコントロール内にあるとき

質問

は、どのように私は、モーダル#seasonInfoModalを開くことができますか?

+0

本当に*サーバー側からポップアップを開く必要はありますか?本当にUpdatePanelが必要ですか?彼らは物事を乱すだけです。 – mason

+0

@mason私は、ユーザーコントロールの内部をモーダルで開く方法を理解する必要があります。 –

+0

この質問は、どのモーダルダイアログが使用されているか、モーダルが開こうとしているイベントに関する詳細は何もないという情報を提供していません。 – kaushalparik27

答えて

3

問題は、ASP.NETによって実行されたID manglingによって引き起こされる可能性があります。モーダルdivはサーバーコントロール(runat="server"で指定)であるため、レンダリングされたHTMLのIDはseasonInfoModalではなく、MyControl1_seasonInfoModalのようなものです。その結果、JavaScriptのセレクタ$('#seasonInfoModal')は見つかりませんでした。

あなたはIDのマングリングを考慮して、起動スクリプトコードを変更し、jQueryのセレクタにseasonInfoModal.ClientIDの値を渡すことができますIDマングリングは次のようになり避けるために

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

他の代替:

をあなたが広告にコードビハインド
  • でのdivコントロールにアクセスする必要がない場合はrunat="server"属性を削除するには
    1. d clientidmode="static"をdivに追加します。
    2. モーダルdivのIDではなく、クラス名(対応するjQueryクラスセレクタを使用)を使用します。

    ただし、これらの3つのソリューションは、ユーザーコントロールのいくつかのインスタンスがフォームに存在する場合、正しく動作しません。最初のインスタンスのモーダルは常に使用され、ケース1と2では、フォームのいくつかのコントロールは同じIDを持ちます。

  • +0

    ちょうど不思議です。 clientidmode = "static"属性を要素に追加すると、同じ処理が実行されますか? '<! - 季節情報 - >

    <! - 季節情報の終了 - >' –

    +0

    @LuisEstevez - これは私の最後の2つの提案と同じ問題を抱えていますが、それもうまくいくでしょう。私はそれを「代替案」のリストに追加します。ありがとう。 (何らかの理由でintellisenseが私のVSエディタのサーバーdivコントロールのためにそれを知っているように見えなかったので、私はそれを言及しなかった)。 – ConnorsFan

    関連する問題