在WebForms中注入一个文本框,并在回发时保留该值



我有一个WebForms页面,我想在运行时将一些额外的控件注入其中。目前,我正在使用Literal控件在Page_Load事件中实现这一点。

例如,页面看起来是这样的(请注意,TextBox1不是一个asp控件,只是为了表明它可以工作):

<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>

以及背后的代码:

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

这很好,两个文本框都显示在屏幕上,但如果我在两个文本中都键入一个值并触发回发,则只保留TextBox1的值。

我已经尝试将代码移动到OnPreRender和OnPreLoad,但仍然存在相同的问题。

我注意到,当我查看页面时,源TextBox1有一个UniqueId(例如ctl00$MainContent$TextBox1),而Textbox2仍然有runat="server"作为属性。

不能像这样注入服务器控件。你需要按照@Arvin的回答添加它们。

但是,您使用与正在执行的操作类似的注入非ASP.NET HTML控件,并获取它们的值。

从您的代码中,将输入的id更改为name,并删除runat="server":

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

然后你可以在回发时得到它的价值:

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

然后,如果你想在回发时添加具有其值的控件:

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

如果你想注入一个文本框,你应该使用这样的占位符:

<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"];
}

最新更新