none
为什么弹出窗口的代码在单一页面正常,放到母版页就不运行了!? RRS feed

  • 问题

  •     最近得到一段代码,可以弹出窗口并通过comfirm看是否执行!

        --

        我把它放在单一的网页中,调试成功了;但我把它放到含母版页的界面中,Button2就没反应了!代码1虚线以上是在单一网页上调试成功的例子,虚线下是在母版页失败的例子!    代码2是后台。

        --

        我把可能出错的那一段代码标记了下划线,请各位帮忙看看,3Q!

    --

    -------------------------------代码1-------------------------------

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title><%--PerformValidation and ValidationGroup Example--%></title>
      </head>
      <body> 
    	    <form id="form1" runat="server"> 
    	    <div> 
    	        <%--JavaScript 的 Confirm 選擇完後,再自動呼叫 C# 函數 - 沒 Ajax / UpdatePanel 的版本--%><p></p> 
    	         
    	        <asp:Button ID="Button1" runat="server" Text="Button1 (按下後會彈出 Confirm 再供選擇)" onclick="Button1_Click"  Font-Size="13px"/> 
    	         
    	        <p></p> 
    	        <%--畫面下方的 Button2 被故意隱藏起來,因我們只是要它的 Button2_Click 事件處理函數,作為傳遞流程的中介。--%><br /> 
    	        <asp:Button ID="Button2" runat="server" Text="" onclick="Button2_Click" ForeColor="White" Width="0px" Height="0px"  
    	            BorderColor="White" BorderWidth="0px" />         
    	    </div> 
    	    </form> 
    	</body> 
    </html>
    -----------------------------------------------------------------------
    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default12.aspx.cs" Inherits="Default12" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
     
    	        <%--JavaScript 的 Confirm 選擇完後,再自動呼叫 C# 函數 - 沒 Ajax / UpdatePanel 的版本--%><p></p> 
    	         
    	        <asp:Button ID="Button1" runat="server" Text="Button1 (按下後會彈出 Confirm 再供選擇)" onclick="Button1_Click"  Font-Size="13px"/> 
    	         
    	        <p></p> 
    	        <%--畫面下方的 Button2 被故意隱藏起來,因我們只是要它的 Button2_Click 事件處理函數,作為傳遞流程的中介。--%><br /> 
    	        <asp:Button ID="Button2" runat="server" Text="" onclick="Button2_Click" ForeColor="White" Width="0px" Height="0px"  
    	            BorderColor="White" BorderWidth="0px" />         
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    </asp:Content>

    ---------------------------------代码2-----------------------------------

    protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("<font color='red'>Button1_Click 執行完成 </font><p>");
            //二段式的 Client-Server 來回 :
            //Server-side 的 Button1_Click 執行完、回到 Client-side 後,會彈出 JavaScript 的 Confirm 對話框,若
            //使用者選擇了「確定」,則會「自動」執行 Button2 的 Click 事件處理常式,亦即二度前往 Server-side
            Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('Submit form?');" +
                "if (retValue) {document.getElementById('Button2').click();}; else { }", true);
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Write("<font color='red'>Button2_Click 執行完成 </font><p>");
            this.func3();
        }
        //這個為我們在後端,真正想被執行的 c# 自訂函數 (可放在 App_Code 資料夾裡的自訂類別)
        private void func3()
        {
            Response.Write("<font color='red'>func3 執行完成 </font><p>");
        }


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2013年10月24日 7:33

答案

  • Sorry! 我的Code多了 ' ,修正如下,

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('Submit form?');" +
                    "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);

    另外,如果您的.net的版本是4.0的話,您可以設定 ClientIDMode="Static" 這樣Client的Id跟Server的Id就會是一致的!

    就可以不用改原本的Code,直接用Button2即可!

    <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" ClientIDMode="Static" />


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月25日 1:36

全部回复

  • 您好,

    在單個page中,Button2的clientID為Button2。

    但包到了masterPage之中,應該不是Button2了哦!

    請使用Button2.ClientID

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('Submit form?');" +
                "if (retValue) {document.getElementById(''" + Button2.ClientID + "'').click();}; else { }", true);   

    Other Info

    http://www.dotblogs.com.tw/rainmaker/archive/2009/10/16/11085.aspx


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已编辑 亂馬客 2013年10月24日 10:09
    2013年10月24日 10:07
  •     谢谢解答!可是我测试了,还是老样子,触发不到Button!

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月24日 12:09
  • Sorry! 我的Code多了 ' ,修正如下,

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('Submit form?');" +
                    "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);

    另外,如果您的.net的版本是4.0的話,您可以設定 ClientIDMode="Static" 這樣Client的Id跟Server的Id就會是一致的!

    就可以不用改原本的Code,直接用Button2即可!

    <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" ClientIDMode="Static" />


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月25日 1:36
  •     谢谢!终于成功了!还有最后一个小小的问题,就是如何把“你选择的时间”和“所属分公司”分行显示呢?我用\n没成功

    protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("<font color='red'>Button1_Click 執行完成 </font><p>");
            string strtime2 = Calendar_Time.SelectedDate.ToShortDateString();
            string strBelongToCompany = DropDownList_Company.SelectedValue.ToString();
            Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);
        }

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月25日 8:09
  • 用“\r\n”看看呢?

    或者拼接:Environment.NewLine看看。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月25日 8:13
  • 您好,

    小弟測試了一下,沒有問題說!

    protected void Button1_Click(object sender, EventArgs e)
            {
                Response.Write("<font color='red'>Button1_Click 執行完成 </font><p>");
                string strtime2 = Calendar_Time.SelectedDate.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
                string strBelongToCompany = string.Empty;
                if(DropDownList_Company.SelectedIndex>-1)
                    strBelongToCompany = DropDownList_Company.SelectedItem.Text;
                Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);
            }


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月25日 8:53
  •     我这样换行('你选择的时间:" + strtime2 + "\r\n所属分公司:" + strBelongToCompany + "')

        可是不行啊!弹不出窗口了!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月25日 9:16
  • 或者拼接:Environment.NewLine看看。

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月25日 9:35
  • 您好,

    或許是有Javascript的錯誤!

    請您按下Button後,檢視網頁的原始碼,看Render出來的Javascript是不是有什麼錯誤的地方!

    或是先response strtime2 及 strBelongToCompany 的值出來!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月26日 9:08
  •     我不会看源代码啊,只好把源代码发到https://skydrive.live.com/?cid=10AE47740A646D6E&id=10AE47740A646D6E%21105上了,能帮我看看么?

        拼接 Environment.NewLine不会用,基础太差了,正努力中。。。


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月28日 1:16
  • \n\r试试看。

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月28日 5:10
  • 您好,

    請問您按下button1,有彈出confirm詢問您嗎?

    它會詢問您yes or no,請按下no後,再檢示源代碼!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月28日 5:19
  • 您好,

    請您先修改Button1_Click function的code

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "所属分公司:" + strBelongToCompany + "'); "  , true);

    然後看confirm有沒有被執行,沒有的話,請檢視源代碼,看看是否有什麼錯誤! 謝謝!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月29日 1:27
  • 谢谢您的解答。目前代码执行良好,唯一的缺陷是不能在提示窗口中把几段信息分行显示!

        下面是我的代码,我想能分行显示更好看如图1的效果

    string strtime2 = Calendar_Time.SelectedDate.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
            string strBelongToCompany = string.Empty;
            if (DropDownList_Company.SelectedIndex > -1)
                strBelongToCompany = DropDownList_Company.SelectedItem.Text;
            Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "    所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);

    ---------------------------图1----------------------------------


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月29日 2:30
  • \n\r看看。

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月29日 3:02
  • 谢谢解答!我用了\n\r后,弹出窗口反而不弹出来了!下面是加了\n\r的代码,我标记了下划线!

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "\n\r    所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月29日 4:00
  • 您好,

    請試一下(@"\n所属分公司:"),

    Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + @"\n所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年10月29日 5:10
  •     谢谢您的耐心解答,这个问题终于完美解决了!后台不利用任何插件,就能让弹出窗口实现“确认、取消”、“分行显示选择的信息”,代码虽长但是简单易懂。

        下面再发一个完整的代码,希望能对后来者有所帮助!真的很佩服msdn上热心人!呵呵!

    -------------------------------前台-----------------------------

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Try_ClientResponse_Default" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
    <asp:DropDownList ID="DropDownList_Company" runat="server" AutoPostBack="True">
                                    <asp:ListItem>九州分公司</asp:ListItem>
                                    <asp:ListItem>物业管理部</asp:ListItem>
                                    <asp:ListItem>株洲分公司</asp:ListItem>
                                </asp:DropDownList>
    	                        <asp:Calendar ID="Calendar_Time" runat="server">
            </asp:Calendar>
    <asp:Button ID="Button1" runat="server" Text="Button1 (按下後會彈出 Confirm 再供選擇)" onclick="Button1_Click"  Font-Size="13px"/> 
    <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click" ClientIDMode="Static" 
    Width="0px" Height="0px" BorderColor="White" BorderWidth="0px"/>
    <%--另外,如果您的.net的版本是4.0的話,您可以設定 ClientIDMode="Static" 這樣Client的Id跟Server的Id就會是一致的!
    就可以不用改原本的Code,直接用Button2即可!--%>	        
    	        
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    </asp:Content>
    

    -----------------------------------后台--------------------------------

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class Try_ClientResponse_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("<font color='red'>Button1_Click 執行完成 </font><p>");
            //二段式的 Client-Server 來回 :
            //Server-side 的 Button1_Click 執行完、回到 Client-side 後,會彈出 JavaScript 的 Confirm 對話框,若
            //使用者選擇了「確定」,則會「自動」執行 Button2 的 Click 事件處理常式,亦即二度前往 Server-side
            //////原代码(适用于无母版页页面),因为在单个的界面中Button2的ClienID还是Button2
            //string strtime2 = Calendar_Time.SelectedDate.ToShortDateString();
            //string strBelongToCompany = DropDownList_Company.SelectedValue.ToString();
            //Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('Submit form?');" +
            //    "if (retValue) {document.getElementById('Button2').click();}; else { }", true);
            
            //////适用于有母版页页面
            string strtime2 = Calendar_Time.SelectedDate.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
            string strBelongToCompany = string.Empty;
            if (DropDownList_Company.SelectedIndex > -1)
                strBelongToCompany = DropDownList_Company.SelectedItem.Text;
            //上面那一句不能展示弹出窗口的分行效果,因为没有用@"\n
            //Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + "    所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);
              Page.ClientScript.RegisterStartupScript(typeof(string), "Button1_Click", "var retValue=confirm('你选择的时间:" + strtime2 + @"\n所属分公司:" + strBelongToCompany + "');" + "if (retValue) {document.getElementById('" + Button2.ClientID + "').click();}; else { }", true);
            
            //1.值得继续研究的:还有一种利用前台OnClientClick来Comfirm的,缺点是不能显示需要确定的信息!优点是简单!
            //2.下面这个可以显示需要确定的信息,但还是会继续执行
            //Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script lanuage=javascript>if(confirm('时间:" + strtime2 + "     分公司:" + strBelongToCompany + "     请确认数据!')==false){history.back()};</script>");
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Write("<font color='red'>Button2_Click 執行完成 </font><p>");
            this.func3();
        }
        //這個為我們在後端,真正想被執行的 c# 自訂函數 (可放在 App_Code 資料夾裡的自訂類別)
        private void func3()
        {
            Response.Write("<font color='red'>func3 執行完成 </font><p>");
        }
    }
    


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年10月29日 7:47