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@
.Я думаю, что мне нужна какая-то рекурсия для этого, но я не могу понять, как это сделать.