Holen Sie sich Text aus dynamisch erstellten Textfeldern in asp.net

Ich habe den ganzen Morgen mit dem Kopf dagegen geschlagen, also kann ich hoffentlich etwas Hilfe bekommen. Im Wesentlichen habe ich Probleme beim Abrufen von Werten von einigen Textfeld-Steuerelementen, die ich dynamisch in .net 4 erstelle.

Hier ist der gewünschte Ablauf der Anwendung.

1). Der Benutzer wählt ein HTML-Dokument aus einem Dropdown-Menü aus, das eine Vorlage für einen Brief ist. Dieses HTML-Dokument hat Tags im Format $ VARIABLENAME $, die durch die korrekten Werte ersetzt werden.

2). Das Programm durchläuft die Vorlage und zieht alle Zeichenfolgen des Formats $ STRING $ heraus und speichert sie in einer Liste.

3). Für jeden Eintrag in dieser Liste generiert das Programm ein asp: label und ein asp: textfeld mit einer eindeutigen ID, die auf dem ursprünglichen $ VARIABLENAME $ -Feld basiert.

4). Der Benutzer gibt Ersatzwerte ein und drückt auf Senden.

5). Das Programm ersetzt alle $ STRING $ durch die Ersetzungswerte und gibt das Ergebnis aus.

Alles funktioniert bis zu dem Punkt, an dem ich Werte aus den Textfeldern abrufen muss. Ich bin mir ziemlich sicher, dass es ein Problem mit dem Seitenlebenszyklus ist, aber da die Textfelder erst generiert werden, wenn die gewünschte Vorlage aus der Dropdown-Liste ausgewählt wird, bin ich mir nicht sicher, wie sie durch Postbacks beibehalten werden, damit ich auf sie verweisen kann.

Mache ich das falsch? Wie greife ich auf die aus einem Dropdown-Ereignis erstellten Textfelder zu, nachdem ein Postback von einem Submitbutton-Ereignis erfolgt ist?

EDIT: Hier ist der größte Teil des relevanten Codes.

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

Später versuche ich, die Werte aus diesen Textfeldern einem Wörterbuch hinzuzufügen. Parameter ist der Name des Wörterbuchs. Das Schlüsselfeld ist $ STRING $. Das Ergebnis ist das, was der Benutzer in das Textfeld eingegeben hat.

   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;

Hier ist der ASPX-Code.

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

BEARBEITEN: Ich habe dies in einen Kommentar eingefügt, als ich es herausgefunden habe, aber ich dachte, ich sollte es in die Frage verschieben, damit es besser sichtbar ist:

Dachte, ich sollte dies aktualisieren. Ich fühle mich wie ein Idiot, aber ich habe es geschafft, das zum Laufen zu bringen. Grundsätzlich habe ich den Controls eine ID zugewiesen, die den Ersatz-Tokens entspricht (also zum Beispiel ID = "$ FIRSTNAME $13$quot;). Es wurde mir nicht einmal klar, dass die Dollars irgendwelche Probleme verursachen würden. Als ich gerade in das Format ID = "Vorname" gewechselt habe, funktioniert es einwandfrei. Vielen Dank für all die Hilfe!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage