2010-05-20 78 views
14

這裏是我想要做的事:點擊我的頁面,這反過來又使(2)事情發生在一個按鈕:ASP.NET:ModalPopupExtender阻止按鈕單擊事件從發射

  1. 顯示ModalPopup以防止用戶完成

這裏是ASP的標記時按下任何按鈕或變更值

  • 叫我的背後方法的代碼,隱藏ModalPopup:

    <asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true" 
        UpdateMode="Always"> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" /> 
        </Triggers> 
        <ContentTemplate> 
         <asp:Panel ID="pnlHidden" runat="server" style="display: none;"> 
          <div> 
          <h1>Saving...</h1> 
          </div> 
         </asp:Panel> 
         <cc1:ModalPopupExtender ID="modalPopup" 
          BackgroundCssClass="modalBackground" runat="server" 
          TargetControlID="btnSaveData" PopupControlID="pnlHidden" 
          BehaviorID="ShowModal"> 
         </cc1:ModalPopupExtender> 
         <asp:Button ID="btnSaveData" runat="server" Text="Save Data" 
          OnClick="btnSaveData_Click" /> 
        </ContentTemplate> 
    </asp:UpdatePanel> 
    

    現在,這裏是我背後的C#代碼代碼:

    protected void btnSaveData_Click(object sender, EventArgs e) 
    { 
        UpdateUserData(GetLoggedInUser()); 
        modalPopup.Enabled = false; 
    } 
    

    爲什麼不這項工作? ModalPopup完美顯示,但不會觸發btnSaveData_Click事件。

    更新:第一個建議對我不起作用。我也嘗試了你的第二個建議(只要它適用於我)。我的一個小小的區別是,我的模式面板上沒有按鈕(pnlHidden) - 這只是一條消息。我曾嘗試在客戶端使用Javascript事件,它至少在我的服務器端事件中同時觸發。這是個好消息,但我似乎無法找到或抓住ModalPopupExtender或其BehaviorID的句柄。這是行不通的:

    function showOverlay() { 
        var popup = $find('modalPopup'); 
        popup.show(); 
    } 
    

    popup總是等於null。

    最後更新:這是我得到這個工作(採取具體的使用注意事項的OnClientClick而onClick則的)最終解決方案:

    <asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true" 
    UpdateMode="Always"> 
    <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" /> 
    </Triggers> 
    <ContentTemplate> 
        <asp:Panel ID="pnlHidden" runat="server" style="display: none;"> 
         <div> 
         <h1>Saving...</h1> 
         </div> 
        </asp:Panel> 
        <cc1:ModalPopupExtender ID="modalPopup" 
         BackgroundCssClass="modalBackground" runat="server" 
         TargetControlID="hdnField" PopupControlID="pnlHidden" 
         BehaviorID="ShowModal"> 
        <asp:HiddenField ID="hdnField" runat="server" /> 
        </cc1:ModalPopupExtender> 
        <asp:Button ID="btnSaveData" runat="server" Text="Save Data" 
         OnClientClick="showModal();" OnClick="btnSaveData_Click" /> 
        </ContentTemplate> 
    </asp:UpdatePanel> 
    

    使用這個JavaScript函數:

    function showModal() { $find('ShowModal').show(); } 
    

    ...以及後面的代碼:

    protected void btnSaveData_Click(object sender, EventArgs e) 
    { 
        UpdateUserData(GetLoggedInUser()); 
        modalPopup.hide(); 
    } 
    
  • 回答

    14

    試試這個。

    創建一個虛擬隱藏字段:

    <asp:HiddenField ID="hdnField" runat="server" /> 
    

    在你的模式彈出申報設置的TargetControlID = 「hdnField」。

    在你btnSaveData_Click情況下,這樣做:

    modalPopup.Show(); 
    
    +0

    你知道什麼是奇怪的,我想這個確切的概念,但與虛擬按鈕,而不是一個HiddenField 。這不起作用(使用Button),但現在它可以使用HiddenField。後續問題雖然:彈出窗口顯示,我的數據庫調用已完成,但modalPopup.Hide()執行得太快,而任何試圖減慢它的嘗試都不會顯示彈出窗口。任何解決方法的想法? – 2010-05-21 18:02:02

    +0

    如果您只是想像使用「加載」屏幕一樣使用模式彈出窗口,我建議將其放入asp:UpdateProgress中。如果速度很快,那很好嗎?你有點想要它快速。當然你可以通過做System.Threading.Thread.Sleep(2000)來延遲任何事情; (2秒)。我確定不建議這樣做。 – 2010-05-21 19:58:11

    +0

    我試過了System.Threading.Thread.Sleep(2000);在我發表我最後的評論之前,當我這樣做時,模態完全消失(從未彈出)。我會嘗試asp:UpdateProgress控件。 – 2010-05-24 15:12:46

    1

    第一次嘗試:請儘量把ButtonID設置成OkControlID標籤,然後再試一次

    OR

    第二次嘗試:在JavaScript調用您的事件似乎有一些問題,點擊事件

    <div> 
        <cc1:ModalPopupExtender PopupControlID="Panel1" 
         ID="ModalPopupExtender1" 
         runat="server" TargetControlID="LinkButton1" OkControlID="Ok" 
         OnOkScript="__doPostBack('Ok','')"> 
        </cc1:ModalPopupExtender> 
        <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton> 
    </div>   
    
    <asp:Panel ID="Panel1" runat="server"> 
        <asp:Button ID="Ok" runat="server" Text="Ok" onclick="Ok_Click" />    
    </asp:Panel> 
    
    3

    試試這個。這是100%的工作

    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
        <ContentTemplate> 
         <asp:Button ID="Btnshow" runat="server" Text="Show" OnClick="Btnshow_Click" /> 
         <asp:Button ID="BtnTarget" runat="server" Text="Target" Style="display: none" /> 
         <asp:TextBox ID="TextBox1" runat="server"> 
         </asp:TextBox> 
         <input type="button" value="Get" onclick="abc()" /> 
         <asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="BtnTarget" 
          PopupControlID="Panel1"> 
         </asp:ModalPopupExtender> 
         <asp:Panel ID="Panel1" runat="server" BackColor="Black" Width="300px" Height="300px"> 
          <asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
           <ContentTemplate> 
            <asp:Button ID="BtnHide" runat="server" Text="Hide Button" OnClick="BtnHide_Click" /> 
           </ContentTemplate> 
           <Triggers> 
            <asp:AsyncPostBackTrigger ControlID="BtnHide" EventName="Click" /> 
           </Triggers> 
          </asp:UpdatePanel> 
         </asp:Panel> 
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="Btnshow" EventName="Click" /> 
        </Triggers> 
    </asp:UpdatePanel> 
    

    服務器端代碼

    protected void Btnshow_Click(object sender, EventArgs e) 
    { 
        ModalPopupExtender1.Show(); 
    } 
    protected void BtnHide_Click(object sender, EventArgs e) 
    { 
        ModalPopupExtender1.Hide(); 
    } 
    
    1

    從這個例子中,你可以輕鬆地控制面板顯示出來取決於條件,而不是一旦你點擊按鈕即可立即顯示面板。

    <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click"/> 
    <asp:HiddenField ID="hdnField" runat="server" /> 
    <ajaxToolkit:ModalPopupExtender runat="server" 
        TargetControlID="hdnField" 
        ID="btnAdd_ModalPopupExtender" 
        PopupControlID="pnlPrintName"> 
    </ajaxToolkit:ModalPopupExtender> 
    <asp:Panel ID="pnlPrintName" runat="server"> 
    . 
    . 
    </asp:Panel> 
    
    //Server side code: 
    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
        if(dt.Rows.Count == 0) 
        { 
        btnAdd_ModalPopupExtender.Show(); 
        } 
        else 
        { 
        add(); 
        } 
    } 
    
    1

    在後面的代碼,你可以這樣做:

    if (true) 
    { 
        var script = @"Sys.Application.add_load(function() { $find('behavoirIDModal').show(); });"; 
        ScriptManager.RegisterStartupScript(this, GetType(), "Show", script, true); 
    } 
    

    改變這種「behavoirIDModal」