如何通过RazorFormat从独立类库加载视图?
如何通过RazorFormat从独立类库加载视图?
当然可以!我来给你梳理几种靠谱的方法,帮你顺利从独立类库加载Razor视图:
方法一:通过嵌入式资源加载
这是最常用的方式,适合把视图打包到类库dll里的场景:
- 先处理类库中的视图文件:选中每个
.cshtml视图文件,右键打开属性面板,把生成操作改成「嵌入式资源」。 - 在主项目中配置
EmbeddedFileProvider,关联类库的程序集,示例代码如下:
// 获取类库的程序集,替换成你类库中实际存在的任意类型 var pluginAssembly = typeof(YourClassLibrary.SomeClass).Assembly; Plugins.Add(new RazorFormat() { FileProvider = new CompositeFileProvider( // 第二个参数是视图所在的命名空间,格式为:类库根命名空间 + 视图文件夹路径 new EmbeddedFileProvider(pluginAssembly, "YourClassLibrary.Views"), // 保留默认文件提供者,确保主项目自身的视图能正常加载 RazorFormat.DefaultFileProvider ) });
要注意哦,这里的命名空间必须和视图文件的嵌入路径对应——比如你的类库根命名空间是MyPluginViews,视图都放在Views文件夹下,那命名空间就是MyPluginViews.Views;如果视图在Views/Home子文件夹里,对应的嵌入式资源路径就是MyPluginViews.Views.Home,配置时一定要匹配准确。
方法二:通过物理文件路径加载
如果你的类库视图是作为物理文件存在(没有嵌入到dll),可以直接配置ViewLocations:
// 替换成你类库视图的实际物理路径 var classLibViewPaths = new List<string> { "/YourClassLibraryPhysicalPath/Views/{1}/{0}.cshtml", "/YourClassLibraryPhysicalPath/Views/Shared/{0}.cshtml" }; Plugins.Add(new RazorFormat() { // 把类库视图路径和默认路径合并,别直接覆盖默认路径,否则主项目视图会找不到 ViewLocations = RazorFormat.DefaultViewLocations.Concat(classLibViewPaths).ToList() });
这里建议用绝对路径,避免相对路径解析出错;同时一定要保留默认的ViewLocations,不然主项目自己的视图就没法正常加载啦。
额外小提示
- 类库的视图结构要遵循Razor的约定:比如对应
HomeController的视图要放在Views/Home文件夹下,共享视图放在Views/Shared里。 - 如果用嵌入式资源,你可以在类库的
AssemblyInfo.cs里添加[assembly: NeutralResourcesLanguage("en")],避免资源加载的区域性问题,不过核心还是要确保命名空间匹配正确。
备注:内容来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

