asp.net-mvc-3 – 使用多个Web应用程序共享控制器和视图

我想将我的控制器和视图分解成不同的类库,以便可以在多个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);
}

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...