I followed Jammer's suggestion and documented, as far as I think, the minimum set of steps to get a project suitable for working as an ASP.NET MVC4 class library project. This was done in Visual Studio 2012 Update 4 and was intended for VB.Net. Subsequently, I can include documentation in Visual Studio 2013 to do something similar if I get a chance. Here are the steps I took:
- Create a new empty MVC4 project with a separate directory for the solution (so you can clearly see that the
packages directory with updated versions of the referenced files is part of the project). - Add a dummy controller, view, and model to test it (which led to copying the output DLL and viewing another web application after creating the class library).
- Delete the following files from the project:
- Entire
App_Start Folder - The entire
App_Data folder and any other empty folders (my Mercurial history did not make this visible, so I'm moving from memory). Global.asaxGlobal.asax.vb- The
Web.config file in the root and dependent Web.Debug.config and Web.Release.config files. (Do not delete Web.config from the Views folder.)
- Delete the following sections from the
Web.config file in the Views folder:appSettingssystem.websystem.webServer- You can also delete the lines
<add namespace="System.Web.Mvc.Ajax" /> and <add namespace="System.Web.Routing" />
- Remove the following links from the project (* the marked links were version links that were included in the
packages directory and have Copy Local and Specific Version for True ).System.Web.EntitySystem.Web.ApplicationServicesSystem.ComponentModel.DataAnnotationsSystem.Data.DataSetExtensionsSystem.Web.ExtensionsSystem.Web.Extensions.DesignSystem.Xml.LinqSystem.Web.AbstractionsSystem.Web.RoutingSystem.ConfigurationSystem.Web.ServicesSystem.EnterpriseServicesMicrosoft.Web.Infrastructure (1.0.0.0) *Microsoft.Web.Mvc.FixedDisplayModes (1.0.0) *Newtonsoft.Json ( Newtonsoft.Json ) *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) *
- Remove the following imports from the project settings for the entire project:
System.Xml.LinqSystem.Collections.SpecializedSystem.ConfigurationSystem.Web.CachingSystem.Web.Mvc.AjaxSystem.Web.RoutingSystem.Web.SessionStateSystem.Web.SecuritySystem.Web.ProfileSystem.Web.UISystem.Web.UI.WebControlsSystem.Web.UI.WebControls.WebPartsSystem.Web.UI.HtmlControls
- Remove the following from
packages.config :- <package id = "Microsoft.AspNet.Mvc.FixedDisplayModes" version = "1.0.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi.Client" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi.Core" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi.WebHost" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.Net.Http" version = "2.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.Web.Infrastructure" version = "1.0.0.0" targetFramework = "net40" />
- <package id = "Newtonsoft.Json" version = "4.5.11" targetFramework = "net40" />
- Remove the following subdirectories from the package folder:
- Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0
- Microsoft.AspNet.WebApi.4.0.20710.0
- Microsoft.AspNet.WebApi.Client.4.0.20710.0
- Microsoft.AspNet.WebApi.Core.4.0.20710.0
- Microsoft.AspNet.WebApi.WebHost.4.0.20710.0
- Microsoft.Net.Http.2.0.20710.0
- Microsoft.Web.Infrastructure.1.0.0.0
- Newtonsoft.Json.4.5.11
This leaves me with the following:
- The VB.Net class library project focused on the .NET Framework 4 (although I assumed that it would be 4.5 - I think it either works).
- The following non-.NET links (marked links must have
Copy Local and Specific Version for True ):- System.web
- packages \ Microsoft.AspNet.Mvc.4.0.20710.0 \ lib \ net40 \ System.Web.Mvc.dll *
- packages \ Microsoft.AspNet.Razor.2.0.20715.0 \ lib \ net40 \ System.Web.Razor.dll *
- packages \ Microsoft.AspNet.WebPages.2.0.20710.0 \ lib \ net40 \ System.Web.WebPages.dll *
- packages \ Microsoft.AspNet.WebPages.2.0.20710.0 \ lib \ net40 \ System.Web.WebPages.Deployment.dll *
- packages \ Microsoft.AspNet.WebPages.2.0.20710.0 \ lib \ net40 \ System.Web.WebPages.Razor.dll *
- The following imports are not default:
- System.web
- System.Web.Mvc
- System.Web.Mvc.Html
- The following files / project structure:
Controllers folder containing CustomUIController.vbModels folder containing CustomUIModel.vbViews containing the CustomUI folder containing Index.vbhtml
Web.config 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
<?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Html" /> </namespaces> </pages> </system.web.webPages.razor> </configuration>
packages.config
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net40" /> <package id="Microsoft.AspNet.Razor" version="2.0.20715.0" targetFramework="net40" /> <package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net40" /> </packages>
CustomUIController.vb
Imports System.Web.Mvc Public Class CustomUIController Inherits Controller Public Function Index() As ActionResult Return View() End Function End Class
CustomUIModel.vb
Public Class CustomUIModel Public Property Name As String Public Property Value As Decimal End Class
Index.vbhtml
@ModelType CustomTemplate.CustomUIModel @Html.LabelFor(Function(m) m.Name)
At this point, I can work with Intellisense, helping me in .vbhtml views and .vb classes, creating a project, and then copying only the views to the folder deployed in the main Views application (in the corresponding subcategory, directory) and the main project DLL for the main deployable bin applications (dependent DLLs already exist).
Edit:
After running the process on another system, to check it and how it works for .NET 4.5 and VS 2013, I noticed the following:
- I think I forgot to mention that the link to
System.Web.DynamicData can be removed. - In VS 2013 and / or .NET 4.5, some versions change:
- packages \ Microsoft.AspNet.Mvc.4.0.30506.0 \ Lib \ net40 \ System.Web.Mvc.dll
- packages \ Microsoft.AspNet.Razor.2.0.30506.0 \ Lib \ net40 \ System.Web.Razor.dll
- packages \ Microsoft.AspNet.WebPages.2.0.30506.0 \ Lib \ net40 \ System.Web.WebPages.dll
- packages \ Microsoft.AspNet.WebPages.2.0.30506.0 \ Lib \ net40 \ System.Web.WebPages.Deployment.dll
- packages \ Microsoft.AspNet.WebPages.2.0.30506.0 \ Lib \ net40 \ System.Web.WebPages.Razor.dll
- I donโt know how much Iโve been convinced of this enough, but links to private (Copy Local) DLL files should be set to โCopy localโ and / or should use the version presented in the packages when creating the project from the MVC4 template. I donโt know why, but standard .NET versions (not private) do not seem to work as far as Intellisense is concerned.
- The best way to check if everything is still OK, as far as the IDE is concerned, is to close the solution, delete the
bin and obj folders in the output of the user project, LabelFor solution, cursor on LabelFor in the Index.vbhtml file and press F12, to see if it takes you to the Object Browser.
Due to new versions, the package file is different:
Packages.config
<packages> <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" /> <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" /> <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" /> </packages>