Search code examples
asp.net-mvc-3viewvirtualpathprovidergriffin.mvccontrib

Loading non embedded views from other projects


I'm working on a mvc3 project which should support modules. So for example I have a MVC3 core project and a MVC3 module project (MyModule).

Now I wish to load and display the views from the MVC3 module project in the core project. I wrote a custom VirtualPathProvider class and a VirtualFile class which fetches the views from other locations than the core project.

Somehow I get the following error: CS0103: The name 'ViewBag' does not exist in the current context.

What I'm doing is loading the assembly from the module project in my core project using the following line of code in the AssemblyInfo class in the core project:

[assembly: PreApplicationStartMethod(typeof(ModuleLoader), "Init")]

The ModuleLoader class fetches the DLL and uses BuildManager.AddReferencedAssembly to add the assembly.

Now I can call action methods in MyModuleController.cs by navigating to http://localhost/MyModule. In the Index ActionResult method of MyModuleController.cs I return the View like this:

return View("~/Modules/MyModule/Index.cshtml");

The VirtualPathProvider checks if the path starts with ~/Modules/ and fetches the view (MyModule -> Views -> Index.cshtml) from the module project.

Now I've searched for the error and I read about missing Web.config files, but I have everything in the module project, because it's a complete MVC3 web project.

I read a lot about loading embedded views from assemblies, but is what I described above even possible?

Thanks in advance!

Edit:

Decided to go the Griffin-MvcContrib way and use its plugin system, which seems to provide everything I need and on top of that it uses Autofac, which I already decided to use for IOC!

Griffin.MvcContrib - The plugin system


Solution

  • Using a custom VirtualPathProvider and adding an reference to the BuildManager is just part of the solution. You also need to modify the views and specify which layout to use for every view in the DLLs.

    Next you also have to use @inherits instead of @model the views.

    Or you can simply use Griffin.MvcContrib which takes care of everything for you: http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/