我有一个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"];
}