0

TL;博士:

我需要将一个 TextBox 插入到 PlaceHolder 中,无论我在哪里看到类似 的标记@token@,并且拆分@不会削减它。我怎样才能做到这一点?

设置:

我有一个数据库驱动的 ASP.NET 页面,在几个地方有合并字段。在其中一个管理页面上,我想通过显示合并字段所在的文本框来使合并字段中的文本可编辑。文本的其余部分需要保持不可编辑。

输入如下所示:

“敏捷的棕色狐狸@foo@跳过@bar@懒惰的@baz@狗。”

此处的合并字段为foobarbaz。我有一个Dictionary<string, string>合并字段的值:

var Tokens = new Dictionary<string, string>
{
    { "foo", "john" },
    { "bar", "george" },
    //...etc...
};

目标:

对于这些文本块中的每一个,我都有一个 PlaceHolder。我想做的是为每个不可编辑的文本块动态插入一个标签,并为每个可编辑的块动态插入一个 TextBox。所以上面的结果就像我硬编码了这样的东西:

<asp:Label   Text="the quick brown fox" />
<asp:TextBox ID="foo" Text="john" />
<asp:Label   Text="jumps over" />
<asp:TextBox ID="bar" Text="george" />
<asp:Label   Text="the lazy" />
...etc...

问题:

匹配@token@模式很容易。诀窍是在正确的位置添加标签和文本框。给定输入中可能有多个标记,因此我必须将其分成可编辑和不可编辑的文本,同时仍跟踪每个 TextBox 对应的合并变量。事实证明,这并不像听起来那么容易。我可以使用正则表达式将输入字符串转换为 HTML,用标签替换@token@模式。<input>但是,这有几个问题:

  • 我已经有大量用于动态服务器控制方法的代码。
  • 我只想匹配特定的令牌,所以/@[a-zA-Z\d]+@/不够严格。

以前的策略:

到目前为止,我只是将输入字符串拆分为@,然后为每个奇数子字符串插入一个标签,为每个偶数子字符串插入一个文本框。效果很好,但是要求正在发生变化。@现在将允许在变量名之外使用符号,因此输入字符串可能如下所示:

blah blah@blah.com @foo@ blah

...在这种情况下,只有foo一个合并字段。

当前策略:

我觉得我需要遍历令牌并构建某种标签和文本框数组。问题是输入中可能包含任意数量的标记,因此一旦我将 TextBoxes 拆分为@foo@,我需要再次遍历文本以获取@bar@. 我想我需要为此进行某种递归,但我不能完全确定它。

4

2 回答 2

2

你可以用正则表达式来做到这一点。表达式看起来像:

@([a-zA-Z0-9])+@

这意味着它匹配所有以 @ 开头、至少包含一个字符 az 或 AZ 或 0-9 并以 @ 结尾的模式

正则表达式匹配

于 2011-05-16T21:50:54.450 回答
0

在发布Fantasyfix的答案之前,我开始研究一种使用字符串操作的递归方法。它似乎工作正常,所以我在这里为其他人发布它:

private void tokenize(PlaceHolder ph, string str)
{
    int index = str.IndexOf('@') + 1;

    if (index == 0)
    {
        ph.Controls.Add(new Label { Text = str });
        return;
    }

    ph.Controls.Add(new Label { Text = str.Substring(0, index - 1) });

    if (Tokens.Keys.Any(k => str.Substring(index).StartsWith(k + "@")))
    {
        int next = str.IndexOf("@", index);
        string key = str.Substring(index, next - index);

        ph.Controls.Add(new TextBox
        {
            ID = "txt" + key,
            Text = Tokens[key],
            TextMode = TextBoxMode.MultiLine,
            Rows = 2
        });

        index = next + 1;
    }

    tokenize(ph, str.Substring(index));
}
于 2011-05-17T15:27:06.533 回答