I have two asp.net MVC 3 web projects that uses the same views, and i would like to put those views in a web project that contains common items like controllers, actionfilters, Extension methods, etc… (the project folder just above those two projects).
I created this custom view engine modifying the views and partial view, locations.
public class GenericViewEngine : RazorViewEngine
{
public GenericViewEngine(): this(null)
{ }
public GenericViewEngine(IViewPageActivator viewPageActivator)
{
base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.FileExtensions = new string[] { "cshtml" };
}
protected override IView CreatePartialView (ControllerContext controllerContext, string partialPath)
{
return base.CreatePartialView(controllerContext, partialPath);
}
protected override IView CreateView (ControllerContext controllerContext, string viewPath, string masterPath)
{
return base.CreateView(controllerContext, viewPath, masterPath);
}
}
Im getting an exception that says: Cannot use a leading .. to exit above the top directory.
How i can put the common views of these two projects out of each web projects? Is there any solution for avoid compile the views into the main common web project?
Thanks in advance.
Jose.
Yes, you could embed them as resources into some plugin assembly and reuse them in multiple projects. For this you will have to write a custom VirtualPathProvider that is able to load views from non-standard locations outside of your current application. You could also take a look at the RazorGenerator project. Here’s an
accompanying blog postexplaining some of the required steps. Basically you need to install the Razor Generator Extension which will precompile your Razor views as part of a class library that you could reference in your MVC application.