2016-05-18 5 views
0

Ich habe eine WebForms-Seite, der zur Laufzeit einige zusätzliche Steuerelemente hinzugefügt werden sollen. Momentan erreiche ich dies im Page_Load-Ereignis mit einem Literal-Steuerelement. In Textfelder in WebForms einspeichern und den Wert für Postback beibehalten

Zum Beispiel die Seite sieht wie folgt aus (beachten Sie, dass die TextBox1 nicht nur eine asp Kontrolle ist, zu zeigen, dass es funktioniert):

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <input id="TextBox1" type="text" runat="server"/> 
    <asp:Literal ID="Literal1" runat="server" Visible="false"></asp:Literal> 

    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 
</asp:Content> 

Und der Code hinter:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Literal1.Visible = true; 
    if (!IsPostBack) Literal1.Text = "<input id=\"TextBox2\" type=\"text\" runat=\"server\"/>"; 
} 

Dies funktioniert Gut und beide Textfelder erscheinen auf dem Bildschirm, aber wenn ich einen Wert in beide eintippe und ein Postback nur den Wert von TextBox1 trage, wird beibehalten.

Ich habe versucht, meinen Code auf OnPreRender und OnPreLoad zu verschieben, aber immer noch das gleiche Problem.

Ich habe festgestellt, dass, wenn ich die Seitenquelle anzeigen TextBox1 hat eine UniqueId (z. B. ctl00 $ MainContent $ TextBox1), während Textbox2 immer noch runat="server" als Attribut hat.

Antwort

1

Sie können keine Server-Steuerelemente wie diese injizieren. Sie müssten sie wie in @ Arvins Antwort vorgeschlagen hinzufügen.

Sie verwenden jedoch inject nonASP.NET HTML-Steuerelemente ähnlich wie Sie tun und ihre Werte abrufen.

aus dem Code ändern id ist der Eingang zu einem name und die Drop runat="server":

protected void Page_Load(object sender, EventArgs e) 
{ 
    Literal1.Visible = true; 
    if (!IsPostBack) Literal1.Text = "<input name=\"TextBox2\" type=\"text\" />"; 
} 

Dann erhalten Sie können es Wert auf Postbacks:

string textbox2value = Request.Form["TextBox2"]; 

Dann, wenn Sie die hinzufügen möchten Kontrolle über Postback mit seinem Wert:

Literal1.Text = "<input name=\"TextBox2\" type=\"text\" value=\"" + 
    Server.HTMLEncode(textbox2value) + "\" />"; 
1

, wenn Sie ein Textfeld injizieren wollen, sollten Sie Platzhalter wie folgt verwenden:

<input id="TextBox1" type="text" runat="server"/> 
<asp:PlaceHolder ID="plh" runat="server"></asp:PlaceHolder> 

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 


protected void Page_Load(object sender, EventArgs e) 
{ 
    TextBox TextBox = new TextBox(); 
    TextBox.ID = "TextBox2"; 
    plh.Controls.Add(TextBox); 
} 


protected void Button1_Click(object sender, EventArgs e) 
{ 
    var Text1 = TextBox1.Value; 
    var Text2 = Request.Form["TextBox2"]; 
} 
+0

Es ist ein Legacy-Produkt an d Die Haut wird als HTML-Rohdatei injiziert, ich weiß nicht, wie ich sie analysieren soll – Newm