Как я могу динамически заменить части текста с TextBoxes? - PullRequest
0 голосов
/ 17 мая 2011

TL; DR:

Мне нужно вставить TextBox в PlaceHolder везде, где я вижу токен, такой как @token@, и разбиение на @ не обрезает его.Как я могу это сделать?

Настройка:

У меня есть управляемая базой данных страница ASP.NET с полями слияния в нескольких местах.На одной из страниц администратора я хочу сделать текст в полях слияния редактируемым, показывая текстовые поля, где находятся поля слияния.Остальная часть текста должна оставаться недоступной для редактирования.

Ввод выглядит так:

"быстрая коричневая лиса @ foo @ перепрыгивает @ bar @ ленивый @ baz @ собака. "

Поля слияния здесь будут foo, bar и baz.У меня есть 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]+@/ недостаточно строг.

Предыдущая стратегия:

До сих пор я просто разбивал входную строку на @, а затем вставлял метку для каждой нечетной подстрокии TextBox для каждой четной подстроки.Это работало нормально, но требования меняются.@ символы теперь будут разрешены вне имени переменной, поэтому входная строка может выглядеть следующим образом:

blah blah@blah.com @ foo @ blah

... в этом случае только foo будет полем слияния.

Текущая стратегия:

Я чувствую, что мне нужно перебрать токены и построить что-то вродемассива меток и текстовых полей.Проблема в том, что на входе может быть любое количество токенов, поэтому, как только я выделю TextBox для @foo@, мне нужно снова просмотреть текст для экземпляров @bar@.Я думаю, что мне нужна какая-то рекурсия для этого, но я не могу понять, как это сделать.

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Вы можете сделать это с помощью регулярных выражений.Выражение будет выглядеть примерно так:

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

это будет означать, что оно соответствует всем шаблонам, которые начинаются с @, содержат как минимум один символ az или AZ или 0-9 и заканчиваются @

Regex.Match

0 голосов
/ 17 мая 2011

До того, как ответ fantasticfix был опубликован, я начал работать над рекурсивным методом, использующим манипуляции со строками. Кажется, он работает правильно, поэтому я выкладываю его здесь для всех остальных:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...