We have a modular architecture where we have some views (cshtml) files in a separate project (class library). How can we get the syntax highlighting and autocomplete to work when the project isn't an MVC project?
Please note that the class library has controllers, views, models etc. It just doesn't have the web.config, global.asax, etc that a normal mvc project would have.
The intellisense works for everything but the so important model:
With MVC3 RTM, if you hover over the Model, you can now get a better error message:
C:\...\Index.cshtml: ASP.NET runtime error: There is no build provider registered for the extension '.cshtml'. You can register one in the <compilation><buildProviders> section in the machine.config or web.config. Make sure is has a BuildProviderAppliesToAttribute attribute which includes the value 'Web' or 'All'.
So I added this:
<compilation>
<assemblies>
<add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
<buildProviders>
<add
extension=".cshtml"
type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
</buildProviders>
</compilation>
Then after adding the build provider, this error message appears:
C:\...\Index.cshtml: ASP.NET runtime error: Could not load file or assembly 'System.Web.WebPages.Razor' or one of its dependencies. The system cannot find the file specified. (C:\...\machine.config line 259)
I have followed Jammer's suggestion and am documenting what I believe is the minimal set of actions to get a project suitable for serving as an ASP.NET MVC4 class library project. This was done in Visual Studio 2012 Update 4, and was targeting VB.Net. I may later include documentation for doing something similar in Visual Studio 2013 if I get a chance. Here are the actions I took:
packages
directory with updated versions of reference files is part of the project).App_Start
folderApp_Data
folder and any other empty folders (my Mercurial history didn't make this visible so I'm going from memory).Global.asax
Global.asax.vb
Web.config
file in the root and the dependentWeb.Debug.config
andWeb.Release.config
files. (Do not deleteWeb.config
from the Views folder.)Web.config
file in the Views folder:appSettings
system.web
system.webServer
<add namespace="System.Web.Mvc.Ajax" />
and<add namespace="System.Web.Routing" />
packages
directory and haveCopy Local
andSpecific Version
set toTrue
).System.Web.Entity
System.Web.ApplicationServices
System.ComponentModel.DataAnnotations
System.Data.DataSetExtensions
System.Web.Extensions
System.Web.Extensions.Design
System.Xml.Linq
System.Web.Abstractions
System.Web.Routing
System.Configuration
System.Web.Services
System.EnterpriseServices
Microsoft.Web.Infrastructure
(1.0.0.0) *Microsoft.Web.Mvc.FixedDisplayModes
(1.0.0) *Newtonsoft.Json
(4.5.11) *System.Net.Http
(2.0.20710.0) *System.Net.Http.Formatting
(4.0.20710.0) *System.Net.Http.WebRequest
(2.0.20710.0) *System.Web.Helpers
(2.0.20710.0) *System.Web.Http
(4.0.20710.0) *System.Web.Http.WebHost
(4.0.20710.0) *System.Xml.Linq
System.Collections.Specialized
System.Configuration
System.Web.Caching
System.Web.Mvc.Ajax
System.Web.Routing
System.Web.SessionState
System.Web.Security
System.Web.Profile
System.Web.UI
System.Web.UI.WebControls
System.Web.UI.WebControls.WebParts
System.Web.UI.HtmlControls
packages.config
:This leaves me with the following:
Copy Local
andSpecific Version
set toTrue
):Controllers
folder containingCustomUIController.vb
Models
folder containingCustomUIModel.vb
Views
folder containingCustomUI
folder, containingIndex.vbhtml
Web.config
file in the Views folder. See below for content.packages.config
file in the root of the project. See below for content.The contents of my files are as follows:
Web.config
packages.config
CustomUIController.vb
CustomUIModel.vb
Index.vbhtml
At this point I am able to work with Intellisense assisting me in the .vbhtml views and the .vb classes, build the project, then copy just the views to the primary application's deployed
Views
folder (in the appropriate sub-directory), and the project's primary output DLL to the primary application's deployedbin
directory (the dependent DLL files are already there).Edit:
After following the process on another system to validate it and how it works for .NET 4.5 and VS 2013, I have noticed the following:
System.Web.DynamicData
can be removed.bin
andobj
folders in the custom project's output, re-load the solution, put the cursor onLabelFor
in the Index.vbhtml file, and press the F12 key to see if it takes you to the Object Browser.Because of the new versions, the packages file is different:
Packages.config
For Visual Studio 2012/ASP.NET MVC 4, you need to update the assembly versions and add
<add key="webpages:Version" value="2.0.0.0" />
toappSettings
. Here's what my Web.config looks like:None of the solutions I could find online or on SO fixed this for me.
May seem like a sledgehammer to crack a nut but I created an MVC 4 application project instead of a class library and ripped out everything I didn't need. Intellisense and
@model
working fine.The webconfig from this post will work. I've copied it below (for posterity):
Alright, this is a longshot, but I ran across the same problem. Are you using JetBrains Resharper?
Resharper overrides VS's intellisense engine but it doesn't understand Razor syntax. You simply have to tell VS to rely on its own intellisense rather than Resharper's.
In VS2010, go Resharper - Options - Intellisense - General. Then check the Visual Studio radio button.
Worked great for me.