Asp.net mvc 有没有办法重复使用编辑器&;在asp mvc应用程序中显示模板?
我们正在开发3个asp mvc应用程序,所有应用程序都需要一些相同的共享编辑器和显示模板视图。与其在所有3个项目中复制/粘贴它们,是否可以将它们放在共享组件中,并在所有应用程序中以某种方式引用它们?如果要从“视图”文件夹以外的位置获取视图,您需要创建自己的Asp.net mvc 有没有办法重复使用编辑器&;在asp mvc应用程序中显示模板?,asp.net-mvc,asp.net-mvc-2,asp.net-mvc-templates,Asp.net Mvc,Asp.net Mvc 2,Asp.net Mvc Templates,我们正在开发3个asp mvc应用程序,所有应用程序都需要一些相同的共享编辑器和显示模板视图。与其在所有3个项目中复制/粘贴它们,是否可以将它们放在共享组件中,并在所有应用程序中以某种方式引用它们?如果要从“视图”文件夹以外的位置获取视图,您需要创建自己的视图引擎 public class CustomViewEngine : WebFormViewEngine { public CustomViewEngine() : base() { MasterLocationF
视图引擎
public class CustomViewEngine : WebFormViewEngine {
public CustomViewEngine() : base() {
MasterLocationFormats = new[] {
"/YourFolder/{1}/{0}.master",
"/YourFolder/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"/YourFolder/{1}/{0}.aspx",
"/YourFolder/{1}/{0}.ascx",
"/YourFolder/Shared/{0}.aspx",
"/YourFolder/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}
//Override the FindView method to implement your own logic
public override ViewEngineResult FindView(
ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
return base.FindView(controllerContext, viewName, masterName, useCache);
}
}
然后在Global.asax
中注册您的ViewEngine
:
protected void Application_Start() {
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());
}
另外,可能会有帮助。(可惜底部的下载链接坏了)
编辑:由于ASP.NET不允许从应用程序目录外加载内容(请参阅的注释),因此此解决方案在实践中似乎不起作用。
但是上面的链接(将视图存储在DB中)仍然有帮助。要在多个ASP.NET应用程序之间共享用户控件(或几乎任何内容),您可以使用下面列出的技巧:
基本思想是将ASCX文件放在一个文件夹中,并将该文件夹放在其他应用程序的虚拟文件夹中(您可以有多个虚拟文件夹指向同一个物理文件夹)。我不确定如何实现,但必须有一种方法在DLL中编译页面并共享库
但是,如果您可以使用自定义视图引擎和其他模板系统(例如Stringtemplate),则可以像共享库一样共享视图:
- 创建类库项目
- 按常规创建模板,并将其标记为“嵌入式资源”。这将确保它们将被放入库的DLL中
- 编写自定义视图引擎以从程序集(DLL)中提取模板。一个好的开始可能是编辑/分叉现有的文件:
- 然后在ASP.NET MVC项目中注册视图引擎
这并不能解决眼前的问题。它仍然不会从其他应用程序(或应用程序外的任何文件夹)加载用户控件。@Eilon,你不是指用户控件的共享视图吗?我的意思是,你的解决方案只允许你将用户控件放在同一应用程序内的其他文件中。最初的问题是多个应用程序共享同一用户控件的能力。我明白了。其实我没有测试这个。但其想法是,应用程序之间共享文件夹的路径将通过MasterLocationFormats
和ViewLocationFormats
属性设置。理论上这是个好主意,但不幸的是ASP.NET会拒绝从应用程序目录之外加载内容(出于安全原因)。这就是为什么需要将虚拟路径映射到两个文件夹中:它确保所有路径都作为子路径映射到应用程序的主文件夹。