Заменить текст разметкой элемента управления с помощью макроса Visual Studio - PullRequest
0 голосов
/ 11 января 2012

Я пытаюсь заменить некоторый текст на странице ASPX литеральным элементом управления с помощью макроса Visual Studio (2010), но похоже, что разметка элемента управления изменяется после замены.

У меня есть страница ASPX со следующим:

<span>Foo</span>

который я пытаюсь заменить на:

<span><asp:Literal Text="<%$ Resources:Foo %>" runat="server" /></span>

Это делается путем выделения текста «Foo» и последующего запуска макроса для замены текста. Однако при выполнении макроса Visual Studio не вставляет текст в точности так, как он был введен.

Мой код макроса выглядит так:

Dim Selection As TextSelection = DTE.ActiveDocument.Selection
Selection.Text = "<asp:Literal Text=""<%$ Resources:Foo %>"" runat=""Server""/>"

Однако, когда макрос выполняется, он вставляет это:

<asp:Literal Text=""<%$ Resources:Foo %>" runat="Server" /> %>"

Обратите внимание на первый набор двойных кавычек (хотя остальные верны) и дополнительные %>", добавленные в конце. Это, кажется, происходит, если текст замены содержит любые кавычки. Например, если я просто попытаюсь заменить выделенный текст на <asp:Literal runat=Server"/>, он будет работать правильно.

Кто-нибудь знает, почему это происходит, и как я могу обойти это?

Спасибо.

1 Ответ

0 голосов
/ 11 января 2012

В конце концов нашел решение, хотя это скорее обходной путь.Кажется, что странное поведение отчасти вызвано настройкой «форматировать код при вставке» в Visual Studio, которая при отключении исправляет проблему с двойными кавычками, но не добавляет дополнительную разметку в конце.

Чтобы обойти это, я теперь заменяю текст случайной строкой, а затем переписываю файл новым текстом.Недостатком этого является то, что Visual Studio выдает приглашение, сообщающее, что файл изменился, и спрашивает, нужно ли его перезагрузить, что необходимо сделать, чтобы увидеть обновление, но по крайней мере фактическое содержимое файла теперь корректно.

Код выглядит следующим образом (упрощенно для этого примера):

Sub ReplaceText()

    'This is the markup we want to replace our selection with
    Dim LiteralMarkup As String = "<asp:Literal Text=""<%$ Resources:Foo %>"" runat=""Server""/>"

    'Generate random GUID to do initial replace
    Dim RandomGuid As String = Guid.NewGuid().ToString()

    'Now replace the selection with the generated guid
    DTE.ActiveDocument.Selection.Text = RandomGuid

    'Save the file
    DTE.ActiveDocument.Save()

    'Now replace the generated guid with the real markup that we want
    Dim NewText As String = File.ReadAllText(DTE.ActiveDocument.FullName).Replace(RandomGuid, LiteralMarkup)

    'Rewrite the file (will cause VS to prompt user to reload file)
    File.WriteAllText(CurrentPath, NewText)

End Sub

Это не идеальное решение, но оно помогает.

Для всех, кому интересно, этот кодиспользуется в макросе, предназначенном для облегчения процесса перемещения текста из файлов aspx или ascx в файлы ресурсов.Полный код доступен здесь: https://gist.github.com/1591239

...