【发布时间】:2026-01-19 12:50:01
【问题描述】:
我们正在开发 3 个 asp mvc 应用程序,它们都需要一些相同的共享编辑器和显示模板视图。与其在所有 3 个项目中复制/粘贴这些,是否有可能以某种方式将它们放在一个共享组件中并以某种方式在所有应用程序中引用它们?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-templates
我们正在开发 3 个 asp mvc 应用程序,它们都需要一些相同的共享编辑器和显示模板视图。与其在所有 3 个项目中复制/粘贴这些,是否有可能以某种方式将它们放在一个共享组件中并以某种方式在所有应用程序中引用它们?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-templates
如果您想从 Views 文件夹以外的位置获取视图,则需要创建自己的 ViewEngine。
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());
}
另外,this post 可能会有所帮助。 (可惜底部的下载链接坏了)
编辑:这个解决方案在实践中似乎行不通,因为 ASP.NET 不允许从应用程序目录之外加载内容(请参阅Eilon 的 cmets)。 但是上面的链接,将视图存储在数据库中,仍然会有所帮助。
【讨论】:
MasterLocationFormats 和ViewLocationFormats 属性设置。这些共享控件将在该文件夹中。
我不确定如何实现,但必须有一种方法可以在 DLL 中编译页面并共享库。
但如果您负担得起使用自定义视图引擎和另一个模板系统(例如 Stringtemplate),那么您可以像共享库一样共享视图:
【讨论】:
要在多个 ASP.NET 应用程序之间共享用户控件(或几乎任何内容),您可以使用此处列出的技巧:http://aspadvice.com/blogs/ssmith/archive/2006/10/05/Tip_3A00_-Share-User-Controls-Between-Applications-in-ASP.NET.aspx
基本思想是将 ASCX 文件放在一个文件夹中,并将该文件夹放入其他应用程序的虚拟文件夹中(您可以有多个虚拟文件夹指向同一个物理文件夹)。
【讨论】: