3

我使用T4MVC,我很高興它,並希望保持它 - 它保持運行時間的缺陷。不幸的是,它使得瀏覽視圖和內容變得更加困難(在T4MVC中的a.k.a. Views and Links)。使用ReSharper的甚至,我無法瀏覽到所引用的項目:Visual Studio宏導航到T4MVC鏈接

T4MVC and Resharper Navigation

我能拿到手上構建宏觀做到這一點?從來沒有構建過VS IDE宏,我沒有掌握如何去做某些事情,比如「Go To Definition」過程的內部結果,如果甚至可能的話。

如果你不熟悉T4MVC,這裏通常是上述宏可能會做些什麼來幫助:

  1. 鑑於令牌:Links.Content.Scripts.jQuery_js在文件MyView.cshtml,「(F12),轉到定義」 。這表現正常。

  2. 已經到達相關任務: public readonly string jQuery_js = "~/Content/Scripts/jQuery.js";由T4MVC生成的文件(這是非常好的,謝謝大衛,但我們真的從來不用看),捕捉指定的字符串,然後關閉文件。

  3. 在解決方案資源管理器中導航到由捕獲的字符串表示的PhysicalPath。

這個過程也將工作的意見/佈局/主頁/分音等

如果你提供一個宏或連結宏來做到這一點,或有另一種解決方案,精彩。否則,關於如何簡單地在VS宏中執行第3步的提示將特別感謝並得到我的讚賞。我會在這裏發佈宏作爲答案。

謝謝!

回答

2

這裏有一個Visual Studio宏來幫助。

它所做的

現在你可能使用T4MVC引用的地方是這樣的:

  • 佈局= MVC.Shared.Views.MasterSiteTheme;
  • ScriptManager.AddResource(Links.Content.Script.jQueryXYZ_js);
  • <鏈接類型= 「文本/ CSS的」 href = 「@ Links.Content.Style.SiteTheme_css」/ >
  • 返回視圖(MVC.Account.Views.SignIn);
  • @ Html.Partial(MVC.Common.Views.ContextNavigationTree)
  • @ Html.ActionLink( 「登錄/註冊」,MVC.Account.SignIn())

F12(轉到定義)已經適用於最後一個項目符號(動作),但是這個黑客意圖覆蓋其他場景(資源)。

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-R-R)記錄一個空的宏,並將其粘貼到其中而不重命名它。如果有人知道在VS中安裝宏的更具說明性的方法,請發表評論。

備註/注意事項

這意味着要取代目前的F12功能,所以如果它不是一個T4MVC鏈接,它會做平常,否則繼續以打開資源。它處理大多數情況,但不處理T4MVC生成的空控制器方法。那些你在之前做過的同一個地方被拋棄。

對於內容/資產/鏈接資源,在解決方案資源管理器中導航到它可能會按順序排列,例如圖像文件,但我沒有在Visual Studio文檔中看到該功能。

+1

好東西!添加論壇返回鏈接:http://t4mvc.codeplex.com/discussions/360266 –

+0

感謝修復,大衛。 – shannon

+1

VS 2013中不再提供宏。是否有另一種方法可以獲得相同的行爲? – Towa