Visual Studio macro to navigate to T4MVC link

余生长醉 提交于 2019-12-07 12:54:43

问题


I use T4MVC and I'm happy with it and want to keep it - it keeps down run time defects. Unfortunately, it makes it harder to navigate to views and content (a.k.a. Views and Links in T4MVC) though. Even using Resharper, I can't navigate to the referenced item:

T4MVC and Resharper Navigation

Can I get a hand building a macro to do this? Never having built a VS IDE macro before, I don't have a grasp on how to get at some things, like the internal results of the "Go To Definition" process, if that's even possible.

If you aren't familiar with T4MVC, here's generally what the macro might do to help:

  1. Given the token: Links.Content.Scripts.jQuery_js in the file MyView.cshtml, '(F12) Go To Definition'. This behaves properly.

  2. Having arrived at the the related assignment: public readonly string jQuery_js = "~/Content/Scripts/jQuery.js"; in a file generated by T4MVC (which is very nice, thank you David, but we really don't ever need to see), capture the string assigned and close the file.

  3. Navigate in Solution Explorer to the PhysicalPath represented by the captured string.

This process would also work for views/layouts/master-pages/partials, etc.

If you provide a macro or link to a macro to do this, or have another solution, wonderful. Otherwise, hints on how to do step 3 simply in a VS macro would be especially appreciated and receive upvote from me. I'd post the macro back here as an answer when done.

Thanks!


回答1:


Here's a Visual Studio macro to help.

What it does

Now you probably use T4MVC references in places like this:

  • Layout = MVC.Shared.Views.MasterSiteTheme;
  • ScriptManager.AddResource(Links.Content.Script.jQueryXYZ_js);
  • <link type="text/css" href="@Links.Content.Style.SiteTheme_css" />
  • return View(MVC.Account.Views.SignIn);
  • @Html.Partial(MVC.Common.Views.ContextNavigationTree)
  • @Html.ActionLink("Sign in / Register", MVC.Account.SignIn())

F12 (Go to Definition) already works for the last bullet (actions), but this hack is intended to cover the other scenarios (resources).

Macro

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

Installation

  • In Visual Studio, press "Alt-F8" to open Macro Explorer.
  • Right-Click "My Macros", select "New Module...", and click "Add".
  • Replace all the text with the code shown here.
  • Save and exit the Macro Editor.
  • Open "Tools : Options".
  • In the left pane, select "Environment : Keyboard".
  • In the "Show commands containing" text field enter "T4".
  • In the "Press shortcut keys:" field press the "F12" key.
  • Click "Assign" and "OK".

On un-patched VS, this installation process doesn't result in a 'bindable' macro. A workaround was to (CTRL-SHIFT-R-R) to record an empty macro, and paste the code into it without renaming it. If someone knows of a more documentable approach to install a macro in VS, please comment.

Notes/Caveats

It's meant to replace the current F12 functionality, so if it isn't a T4MVC link, it will do the usual, otherwise it continues on to open the resource. It handles the majority of cases, but not T4MVC-generated empty controller methods. Those you get dumped off at the same place you did before.

For Content/Asset/Link resources, navigating to it in Solution Explorer would probably be in order, for image files for example, but I didn't see that functionality in the Visual Studio docs.



来源:https://stackoverflow.com/questions/11100124/visual-studio-macro-to-navigate-to-t4mvc-link

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!