我想将我的控制器和视图分解成不同的类库,以便可以在多个ASP.NET MVC 3应用程序中重用。使用单独的程序集时,控制器部分不是问题,而是让视图引擎找到视图。
我最终使用了Compile your asp.net mvc Razor views into a seperate dll。
有没有更容易的方式我错过了?
解决方法
我修改了发布
here的想法,与MVC3一起工作。这是非常快速和容易。唯一的缺点是共享视图需要嵌入资源,因此编译。
将您的共享视图(.cshtml,.vbhtml文件)放入库项目中。 (我也在这个项目中有一些共享控制器。)如果要使用应用程序中的_Layout.cshtml,请确保包含指向它的_ViewStart.cshtml与您的共享视图。
>在库项目中,将所有视图的“构建操作”属性设置为“嵌入式资源”。
>在库项目中添加以下代码,将将您的视图的内容写入tmp / Views目录。
。
public class EmbeddedResourceViewEngine : RazorViewEngine { public EmbeddedResourceViewEngine() { ViewLocationFormats = new[] { "~/Views/{1}/{0}.aspx","~/Views/{1}/{0}.ascx","~/Views/Shared/{0}.aspx","~/Views/Shared/{0}.ascx","~/Views/{1}/{0}.cshtml","~/Views/{1}/{0}.vbhtml","~/Views/Shared/{0}.cshtml","~/Views/Shared/{0}.vbhtml","~/tmp/Views/{0}.cshtml","~/tmp/Views/{0}.vbhtml" }; PartialViewLocationFormats = ViewLocationFormats; DumpOutViews(); } private static void DumpOutViews() { IEnumerable<string> resources = typeof(EmbeddedResourceViewEngine).Assembly.GetManifestResourceNames().Where(name => name.EndsWith(".cshtml")); foreach (string res in resources) { DumpOutView(res); } } private static void DumpOutView(string res) { string rootPath = HttpContext.Current.Server.MapPath("~/tmp/Views/"); if (!Directory.Exists(rootPath)) { Directory.CreateDirectory(rootPath); } Stream resStream = typeof(EmbeddedResourceViewEngine).Assembly.GetManifestResourceStream(res); int lastSeparatorIdx = res.LastIndexOf('.'); string extension = res.Substring(lastSeparatorIdx + 1); res = res.Substring(0,lastSeparatorIdx); lastSeparatorIdx = res.LastIndexOf('.'); string fileName = res.Substring(lastSeparatorIdx + 1); Util.SaveStreamToFile(rootPath + fileName + "." + extension,resStream); } }
我正在使用Adrian的StreamToFile作者,发现here。
>在您的应用程序的Global.asax.cs中添加:
。
public static void RegisterCustomViewEngines(ViewEngineCollection viewEngines) { //viewEngines.Clear(); //This seemed like a bad idea to me. viewEngines.Add(new EmbeddedResourceViewEngine()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); RegisterCustomViewEngines(ViewEngines.Engines); }