none
請問使用 ajax dynamic add control時,為何在masterpage會沒有反應呢 RRS feed

解答

  • 建議你:

    1. 將Button的UseSubmitBehavior設定為false
    2. 在Page_Load用Request.Form["__EVENTTARGET"]判斷是否為Button的UniqueID ,因為套用MasterPage

    範例:

    .aspx

     

    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button1" runat="server" Text="再多一個textbox" UseSubmitBehavior="false" />
                <br />
                dynamic adding controls:<br />
                <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Content>
    

     


    .aspx.cs

     

    public partial class Sample : System.Web.UI.Page
    {
        private static readonly int defaultControlCount = 5;
    
        private int MoreTextBoxCount
        {
            get
            {
                return this.ViewState["MoreTextBoxCount"] == null ? 0 : Convert.ToInt32(this.ViewState["MoreTextBoxCount"]);
            }
            set
            {
                this.ViewState["MoreTextBoxCount"] = value;
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.Request.Form["__EVENTTARGET"] == this.Button1.UniqueID)
            {
                this.MoreTextBoxCount += 1;
            }
    
            this.GenerateTextBox();
        }
    
        private void GenerateTextBox()
        {
            var count = defaultControlCount + this.MoreTextBoxCount;
            for (int i = 0; i < count; i++)
            {
                var textbox = new TextBox();
                textbox.ID = string.Format("joey_txt{0}", i.ToString());
                var label = new Label();
                label.ID = string.Format("joey_lbl{0}", i.ToString());
                label.Text = "<br/>";
                this.PlaceHolder1.Controls.Add(textbox);
                this.PlaceHolder1.Controls.Add(label);
            }
        }
    }
    

     


    結果圖如下:

    按完按鈕後:

    一直按按鈕,多按一下就會多新增一個textbox,且畫面上輸入的值不會消失。

    附上文章link: [ASP.NET]套用MasterPage後,如何動態新增控制項


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    2011年11月30日 下午 12:09
    版主

所有回覆

  • 您提供這樣的reference跟問題資訊,是希望每個人先把影片看一遍,再來想辦法協助您解決問題嗎?


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年11月30日 上午 10:29
    版主
  • 不好意思,我沒有說清楚

    是影片下方的sample程式

    因為我的程式是要放在masterpage 中的

    沒有masterpage測試都OK,放進masterpage 就沒反應了

    2011年11月30日 上午 10:37
  • 把你關鍵的程式碼貼上來。讓想幫你的人可以不用這麼麻煩。還要下載、用IDE開啟。
    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年11月30日 上午 10:50
    版主
  • <%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="WebApplication15.test" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div style="text-align: center">
        <div style="background-color: Aqua; width: 250px;">
        <br />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:PlaceHolder runat="server" ID="myPlaceHolder"></asp:PlaceHolder>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="btnAddTextBox" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
        <br />
        </div>
        <br />
        <asp:Button ID="btnAddTextBox" runat="server"  Text="Add TextBox" OnClick="btnAddTextBox_Click" />
        <br /><br />
        <asp:UpdatePanel ID="UpdatePanel2" runat="server">
            <ContentTemplate>
                <asp:Button runat="server" ID="MyButton" Text="Get Values." OnClick="MyButton_Click" />
                <br /><br />
                <asp:Label runat="server" ID="MyLabel"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
     </div>
    </asp:Content>
    
    




    Public Class test
        Inherits System.Web.UI.Page
    
        Shared myCount As Integer = 5
        Private dynamicTextBoxes() As TextBox
    
        Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
            Dim myControl As Control = GetPostBackControl(Me.Page)
    
            If (myControl IsNot Nothing) Then
                If (myControl.ClientID.ToString() = "btnAddTextBox") Then
                    myCount = myCount + 1
                End If
            End If
        End Sub
    
        Protected Overrides Sub OnInit(ByVal e As EventArgs)
            MyBase.OnInit(e)
            dynamicTextBoxes = New TextBox(myCount - 1) {}
            Dim i As Integer
            For i = 0 To myCount - 1 Step i + 1
                Dim textBox As TextBox = New TextBox()
                textBox.ID = "myTextBox" + i.ToString()
                myPlaceHolder.Controls.Add(textBox)
                dynamicTextBoxes(i) = textBox
                Dim literalBreak As LiteralControl = New LiteralControl("<br />")
                myPlaceHolder.Controls.Add(literalBreak)
            Next
        End Sub
    
        Protected Sub btnAddTextBox_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddTextBox.Click
            ' Handled in preInit due to event sequencing.
        End Sub
    
        Protected Sub MyButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            MyLabel.Text = ""
            Dim tb As TextBox
            For Each tb In dynamicTextBoxes
                MyLabel.Text += tb.Text + " :: "
            Next
        End Sub
    
    
        Public Shared Function GetPostBackControl(ByVal thePage As Page) As Control
            Dim myControl As Control = Nothing
            Dim ctrlName As String = thePage.Request.Params.Get("__EVENTTARGET")
            If ((ctrlName IsNot Nothing) And (ctrlName <> String.Empty)) Then
                myControl = thePage.FindControl(ctrlName)
            Else
                For Each Item As String In thePage.Request.Form
                    Dim c As Control = thePage.FindControl(Item)
                    If (TypeOf (c) Is System.Web.UI.WebControls.Button) Then
                        myControl = c
                    End If
                Next
    
            End If
            Return myControl
        End Function
    
    End Class
    

    不好意思,第一次操作

    2011年11月30日 上午 11:11
  • 2011年11月30日 上午 11:19
    版主
  • 你如果直接原封不動把sample code移植到masterpage 

    那一定會出問題,因為事件順序時間點不同,有可能會發生當PlaceHolder control還沒生出來時,你的程式已經要動態add control給PlaceHolder了

     

    所以你還是把你現在寫的code,關鍵程式碼貼上來吧


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚
    2011年11月30日 上午 11:19
    版主
  • 建議你:

    1. 將Button的UseSubmitBehavior設定為false
    2. 在Page_Load用Request.Form["__EVENTTARGET"]判斷是否為Button的UniqueID ,因為套用MasterPage

    範例:

    .aspx

     

    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button1" runat="server" Text="再多一個textbox" UseSubmitBehavior="false" />
                <br />
                dynamic adding controls:<br />
                <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Content>
    

     


    .aspx.cs

     

    public partial class Sample : System.Web.UI.Page
    {
        private static readonly int defaultControlCount = 5;
    
        private int MoreTextBoxCount
        {
            get
            {
                return this.ViewState["MoreTextBoxCount"] == null ? 0 : Convert.ToInt32(this.ViewState["MoreTextBoxCount"]);
            }
            set
            {
                this.ViewState["MoreTextBoxCount"] = value;
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.Request.Form["__EVENTTARGET"] == this.Button1.UniqueID)
            {
                this.MoreTextBoxCount += 1;
            }
    
            this.GenerateTextBox();
        }
    
        private void GenerateTextBox()
        {
            var count = defaultControlCount + this.MoreTextBoxCount;
            for (int i = 0; i < count; i++)
            {
                var textbox = new TextBox();
                textbox.ID = string.Format("joey_txt{0}", i.ToString());
                var label = new Label();
                label.ID = string.Format("joey_lbl{0}", i.ToString());
                label.Text = "<br/>";
                this.PlaceHolder1.Controls.Add(textbox);
                this.PlaceHolder1.Controls.Add(label);
            }
        }
    }
    

     


    結果圖如下:

    按完按鈕後:

    一直按按鈕,多按一下就會多新增一個textbox,且畫面上輸入的值不會消失。

    附上文章link: [ASP.NET]套用MasterPage後,如何動態新增控制項


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    2011年11月30日 下午 12:09
    版主