3

我使用 T4MVC,我对它很满意并希望保留它——它可以减少运行时缺陷。不幸的是,它使得导航到视图和内容(在 T4MVC 中也称为视图和链接)变得更加困难。即使使用 Resharper,我也无法导航到引用的项目:

T4MVC 和 Resharper 导航

我可以帮忙构建一个宏来执行此操作吗?以前从未构建过 VS IDE 宏,我不知道如何处理某些事情,比如“转到定义”过程的内部结果,如果可能的话。

如果您不熟悉 T4MVC,宏可能会提供以下帮助:

  1. 给定令牌:Links.Content.Scripts.jQuery_js在文件 MyView.cshtml 中,'(F12) Go To Definition'。这表现得很好。

  2. 完成相关任务后: public readonly string jQuery_js = "~/Content/Scripts/jQuery.js";在 T4MVC 生成的文件中(非常好,谢谢 David,但我们真的不需要查看),捕获分配的字符串并关闭文件。

  3. 在解决方案资源管理器中导航到由捕获的字符串表示的 PhysicalPath。

此过程也适用于视图/布局/母版页/部分等。

如果您提供宏或宏链接来执行此操作,或者有其他解决方案,那就太好了。否则,将特别感谢有关如何在 VS 宏中简单地执行第 3 步的提示,并获得我的支持。完成后,我会将宏发回此处作为答案。

谢谢!

4

1 回答 1

2

这是一个可以提供帮助的 Visual Studio 宏。

它能做什么

现在你可能会在这样的地方使用 T4MVC 引用:

  • 布局 = MVC.Shared.Views.MasterSiteTheme;
  • ScriptManager.AddResource(Links.Content.Script.jQueryXYZ_js);
  • <link type="text/css" href="@Links.Content.Style.SiteTheme_css" />
  • 返回视图(MVC.Account.Views.SignIn);
  • @Html.Partial(MVC.Common.Views.ContextNavigationTree)
  • @Html.ActionLink("登录/注册", MVC.Account.SignIn())

F12(转到定义)已经适用于最后一个项目符号(操作),但此 hack 旨在涵盖其他场景(资源)。

Imports EnvDTE
Imports System.IO

Public Module NavT4Link
    Sub NavigateToLink()
        DTE.ExecuteCommand("Edit.GoToDefinition")
        Dim navpath As String = Path.GetFileName(DTE.ActiveDocument.FullName)
        Dim isContentLink As Boolean = navpath.Equals("T4MVC.cs")
        If (isContentLink Or navpath.EndsWith("Controller.generated.cs")) Then
            Dim t4doc As TextDocument = DTE.ActiveDocument.Object()
            navpath = CurrentLinePathConstant(t4doc)
            If isContentLink Then
                t4doc.Selection.MoveToPoint(t4doc.Selection.ActivePoint.CodeElement(vsCMElement.vsCMElementClass).StartPoint)
                t4doc.Selection.FindText("URLPATH")
                navpath = Path.Combine(CurrentLinePathConstant(t4doc), navpath)
            End If
            If navpath.StartsWith("~") Then
                DTE.ActiveDocument.Close(vsSaveChanges.vsSaveChangesPrompt)
                Dim proj As Object = DTE.Solution.FindProjectItem(DTE.ActiveDocument.FullName).ContainingProject
                navpath = Path.GetDirectoryName(proj.Fullname()) + navpath.TrimStart("~")
                DTE.ItemOperations.OpenFile(navpath)
            End If
        End If
    End Sub

    Function CurrentLinePathConstant(ByVal t4doc As TextDocument) As String
        t4doc.Selection.SelectLine()
        Dim sa() As String = t4doc.Selection.Text().Split("""")
        If sa.Length > 1 Then Return sa(sa.Length - 2) Else Return ""
    End Function
End Module

安装

  • 在 Visual Studio 中,按“Alt-F8”打开宏资源管理器。
  • 右键单击“我的宏”,选择“新建模块...”,然后单击“添加”。
  • 用此处显示的代码替换所有文本。
  • 保存并退出宏编辑器。
  • 打开“工具:选项”。
  • 在左侧窗格中,选择“环境:键盘”。
  • 在“显示包含的命令”文本字段中输入“T4”。
  • 在“按下快捷键:”字段中按下“F12”键。
  • 单击“分配”和“确定”。

在未打补丁的 VS 上,此安装过程不会产生“可绑定”宏。一种解决方法是 (CTRL-SHIFT-RR) 记录一个空宏,并将代码粘贴到其中而不重命名它。如果有人知道在 VS 中安装宏的更可记录的方法,请发表评论。

注释/注意事项

它旨在替换当前的 F12 功能,因此如果它不是 T4MVC 链接,它将照常执行,否则它会继续打开资源。它处理大多数情况,但不处理 T4MVC 生成的空控制器方法。那些你在你以前做过的地方被抛弃的人。

对于内容/资产/链接资源,在解决方案资源管理器中导航到它可能是正确的,例如图像文件,但我在 Visual Studio 文档中没有看到该功能。

于 2012-06-19T13:42:52.907 回答