我整个早上都在苦苦思索这个问题,希望能得到一些帮助。实际上,我在使用 .net 4 动态创建文本框控件时遇到了问题。
以下是应用程序的预期流程:
1)用户从下拉菜单中选择一个作为信函模板的 HTML 文档。此 HTML 文档具有格式为 $VARIABLENAME$ 的标记,将被替换为正确的值。
2)程序运行该模板并提取所有格式为 $STRING$ 的字符串,并将它们存储在列表中。
3)对于此列表中的每个条目,程序会生成一个具有基于原始 $VARIABLENAME$ 字段的唯一 ID 的 asp:label 和 asp:textbox。
4)用户输入替换值,然后点击提交。
5)程序将所有 $STRING$ 替换为替换值并输出结果。
一切顺利进行直到需要从文本框中获取值的那一步。我非常确定这是与页面生命周期有关的问题,但由于文本框要在用户从下拉菜单中选择所需模板后才会生成,我不知道如何使它们通过 postback 持久存在,以便可以引用它们。
我是否做错了什么?在 postback 事件发生后,如何访问从下拉事件创建的文本字段?
编辑: 以下是大部分相关代码。
以下是应用程序的预期流程:
1)用户从下拉菜单中选择一个作为信函模板的 HTML 文档。此 HTML 文档具有格式为 $VARIABLENAME$ 的标记,将被替换为正确的值。
2)程序运行该模板并提取所有格式为 $STRING$ 的字符串,并将它们存储在列表中。
3)对于此列表中的每个条目,程序会生成一个具有基于原始 $VARIABLENAME$ 字段的唯一 ID 的 asp:label 和 asp:textbox。
4)用户输入替换值,然后点击提交。
5)程序将所有 $STRING$ 替换为替换值并输出结果。
一切顺利进行直到需要从文本框中获取值的那一步。我非常确定这是与页面生命周期有关的问题,但由于文本框要在用户从下拉菜单中选择所需模板后才会生成,我不知道如何使它们通过 postback 持久存在,以便可以引用它们。
我是否做错了什么?在 postback 事件发生后,如何访问从下拉事件创建的文本字段?
编辑: 以下是大部分相关代码。
protected void createTextBoxes(List<string> results)
{
if (results != null)
{
foreach (string result in results)
{
string formattedResult = result.Substring(1, result.Length - 2);
formattedResult = formattedResult.ToLower();
formattedResult = char.ToUpper(formattedResult[0]) + formattedResult.Substring(1);
var label = new Label();
label.ID = formattedResult;
label.Text = formattedResult + ": ";
templateFormPlaceholder.Controls.Add(label);
var textBox = new TextBox();
textBox.ID = result;
templateFormPlaceholder.Controls.Add(textBox);
templateFormPlaceholder.Controls.Add(new LiteralControl("<br />"));
previewBtn.Visible = true;
}
}
}
protected void templateDD_SelectedIndexChanged(object sender, EventArgs e)
{
var templatePath = "";
if (templateDD.SelectedIndex == 0)
{
previewBtn.Visible = false;
}
if (templateDD.SelectedIndex == 1)
{
templatePath = employeePath;
}
else if (templateDD.SelectedIndex == 2)
{
templatePath = managerPath;
}
List<string> regMatches = FindMatches(templatePath);
Session["regMatches"] = regMatches;
createTextBoxes(regMatches);
}
protected void Page_Init(object sender, EventArgs e)
{
if (Session["regMatches"] != null)
{
createTextBoxes((List<string>)Session["regMatches"]);
}
}
接下来,我想将这些文本框中的值添加到一个字典中。参数是字典的名称。键字段是$STRING$,结果是用户在文本框中输入的内容。
protected void previewBtn_Click(object sender, EventArgs e)
{
List<string> matchResults = (List<string>)Session["regMatches"];
Dictionary<string, string> parameters = new Dictionary<string, string>();
foreach (string result in matchResults)
{
TextBox tb = (TextBox)templateFormPlaceholder.FindControl(result);
parameters.Add(result, tb.Text);
}
var template = ReplaceKeys(parameters);
outputLBL.Text = template;
这是 .aspx 代码。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="offerLetter.aspx.cs" Inherits="templateRegexTesting.offerLetter" %>
<!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 runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
Which template would you like to use?
</p>
<asp:DropDownList ID="templateDD" runat="server" OnSelectedIndexChanged="templateDD_SelectedIndexChanged"
AutoPostBack="true">
<asp:ListItem></asp:ListItem>
<asp:ListItem Value="1">Employee</asp:ListItem>
<asp:ListItem Value="2">Manager</asp:ListItem>
</asp:DropDownList>
<br />
<asp:PlaceHolder ID="templateFormPlaceholder" runat="server" />
<div>
<asp:Button ID="previewBtn" runat="server" Text="Preview" Visible="false" OnClick="previewBtn_Click" />
</div>
<div>
<asp:Label ID="outputLBL" runat="server"></asp:Label>
</div>
<br />
</div>
</form>
</body>
</html>
编辑:当我解决问题时,我将这条信息写在了评论区,但我认为我应该将它移到问题区,以便更加显眼:
我觉得我应该更新一下这个问题。我有点傻,但我设法让它工作了。基本上,我给控件分配了一个等于替换标记的ID(例如ID="$FIRSTNAME$")。我甚至没有意识到$会导致任何问题。当我只是把格式改为ID="Firstname"时,它完美地工作。感谢你们所有人的帮助!