使用Visual Studio宏将控件标记替换为文本

时间:2012-01-10 20:24:16

标签: visual-studio visual-studio-2010 macros replace

我正在尝试使用Visual Studio(2010)宏将文本控件替换为ASPX页面中的某些文本,但似乎在替换时正在修改控件标记。

我有一个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 :(得分:0)

最终找到了一个解决方案,尽管它更像是一种解决方法。奇怪的行为似乎部分是由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