Macro to add a Codebehind file to an ASPX page in VS2005
The best way to add a code file (a.k.a. codebehind) to an ASP.NET ASPX page is check the "Place code in separate file" checkbox when you create it:
However, as Fritz Onion wrote, it's nice to avoid creating unnecessary codebehind files "just in case", because the with advanced web controls in ASP.NET 2.0, it's possible that many of your pages won't need any additional code.
The problem: If you're working with a page wasn't created with a codebehind file, there's no "right-click / add code file" option. Mikhail Arkhipov wrote some basic directions on how to do this manually, and Fritz's post goes into a little more detail. Fritz asked for a plugin to add code files to an ASPX page, but I'll settle for a Visual Studio macro. This thing's pretty simple - just select the ASPX file in the solution explorer, then run the macro. There's some error handling, but I'd make sure you save your work before running this.
I've started playing with upgrading it to a Visual Studio Addin (using the MakeAddin macro), but it's not working yet.
Sub AddCodeBehind()
Dim docName
Dim docFullName
Dim nameOfType
Try
DTE.ExecuteCommand("View.ViewCode")
docName = DTE.ActiveDocument.Name
If (docName.ToString().EndsWith(".aspx") = False) Then
Throw New System.Exception()
End If
Catch ex As Exception
Throw New System.Exception("You must select an ASPX file in the Solution Explorer before running this macro.")
End Try
nameOfType = Replace(docName, ".aspx", "")
docFullName = DTE.ActiveDocument.FullName
DTE.ExecuteCommand("Edit.Replace")
DTE.Find.ReplaceWith = "<%@ Page Language=""C#"" CodeFile=""" + nameOfType + ".aspx.cs"" Inherits=""" + nameOfType + """"
DTE.Windows.Item("" + nameOfType + ".aspx").Activate()
DTE.Find.FindWhat = "<%@ Page Language=""VB"""
DTE.Find.ReplaceWith = "<%@ Page Language=""C#"" CodeFile=""" + nameOfType + ".aspx.cs"" Inherits=""" + nameOfType + """"
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
DTE.Find.FindWhat = "<%@ Page Language=""C#"""
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
End If
'{CF2DDC32-8CAD-11D2-9302-005345000000} is the GUID for the Find / Replace Dialog
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()
DTE.ActiveDocument.Save()
DTE.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes)
DTE.ItemOperations.AddNewItem("Web Developer Project Files\Visual C#\Class", docName + ".cs")
DTE.ExecuteCommand("Edit.Replace")
DTE.Windows.Item(nameOfType + ".aspx.cs").Activate()
DTE.Find.FindWhat = "public class " + nameOfType
DTE.Find.ReplaceWith = "public partial class " + nameOfType + " : Page"
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
Throw New System.Exception("vsFindResultNotFound")
End If
'{CF2DDC32-8CAD-11D2-9302-005345000000} is the GUID for the Find / Replace Dialog in case you missed that earlier comment
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()
DTE.ActiveDocument.Save()
DTE.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes)
DTE.ItemOperations.OpenFile(docName)
DTE.ItemOperations.OpenFile(docFullName + ".cs")
End Sub