我正在尝试使用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"/>
替换所选文本,则它可以正常工作。
有谁知道为什么会这样,以及我如何解决这个问题?
感谢。
答案 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