The best thing about using Razor to generate server-side HTML is that you get full intellisense when writing your HTML files. The thing is, when you use RazorMachine in a console application, out of the box, I was getting intellisense errors.
There are a couple of things you need to do to fix these issues. They consist of altering the app.confg file and making sure a couple of ASP.NET DLL's are located in the bin directory
The code for this blog post can be found on Github here: OceanAirdrop/TestRazorMachineHTMLTemplate
Unload & then Reload project to see changes
The first thing to know, when making changes to the app.config files is that, to see the changes you have made you need to unload and reload the project.
Once you have unloaded your project, to reload you can select the "Reload Project" option:
If you don't reload the project you won't see the changes. It's either that or restart visual studio!!
Problem 1 - Fixing 'implicitly typed local variable' error CS8023
If you use the var keyword in your cshtml:
then you might see errors like this:
To fix that, and other errors, we need to add the following to the
The actual snip that should be copied and pasted into the app.config file is as follows:
<system.web> <compilation debug="true" targetFramework="4.5"> <assemblies> <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add assembly="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <add assembly="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </assemblies> </compilation> <pages> <namespaces> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> </namespaces> </pages> </system.web>
Problem 2 - Fixing missing Helpers, WebPages errors CS0234
In a console application, by default we do not have access to the ASP.NET DLLs that are expected by Razor so we will see the following errors in the "Errors List" window
To fix these issues you need to make sure you have got the 'Microsoft.AspNet.Mvc' nuget package installed on your project. This will bring along a couple of dependencies with it.
That will give you the necessary DLLs that Razor depends on.
Now, it should be noted that you only need these nuget packages so that you can copy the following DLLs to the root Bin directory.
- System.Web.Helpers.dll
- System.Web.Mvc.dll
- System.Web.WebPages.dll
After you have these DLLs you could remove the nuget packages Microsoft.AspNet.Mvc and Microsoft.AspNet.WebPages.
Problem 3 - Copying DLLs to root of Bin directory
Now, even with the necessary DLL's you will still see intelisense errors. It turns out because razor is a ASP.NET web component it expects the DLLs to be in the root of the Bin directory and not the Bin\Debug or Bin\Release directory.
So if your directory looks like this:
...you need to copy the following DLLs to the root of the bin directory
For my test project, I setup a batch file that world run as a post-build event
and make sure you call the batch file runs on every build
Another way of doing this would be to copy the following DLLs to a 3rdParty directory and modify the batch file to copy these to the root Bin directory on every build.
- System.Web.Helpers.dll
- System.Web.Mvc.dll
- System.Web.WebPages.dll
That way, you are not taking a dependency on extra DLLs that you are not using.
Problem 4 - Adding DLLs
I had another problem that my console app was using a seperate DLL in my project. Razor pages couldnt find the types to provide intellisense and the "Error List" window gives you errors like: The type 'StarWarsCharacter' is defined in an assembly that is not referenced.
To fix errors like this, you need to add the DLLs to the assemblies section of the app.config file.
Code
I have a sample project on Github that can be found here: OceanAirdrop/TestRazorMachineHTMLTemplate
That's it!
With those couple of changes in place in the console project, we get full intellisense (with no errors!) when editing cshtml razor files. Yay!