【问题标题】:Is there any way to re-use editor & display templates in asp mvc applications?有没有办法在 asp mvc 应用程序中重用编辑器和显示模板?
【发布时间】:2026-01-19 12:50:01
【问题描述】:

我们正在开发 3 个 asp mvc 应用程序,它们都需要一些相同的共享编辑器和显示模板视图。与其在所有 3 个项目中复制/粘贴这些,是否有可能以某种方式将它们放在一个共享组件中并以某种方式在所有应用程序中引用它们?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-templates


    【解决方案1】:

    如果您想从 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)。 但是上面的链接,将视图存储在数据库中,仍然会有所帮助。

    【讨论】:

    • 这并不能解决手头的问题。它仍然不会从其他应用程序(或应用程序外的任何文件夹)加载用户控件。
    • @Eilon,你不是说用户控件的共享视图吗?
    • 我的意思是您的解决方案只允许您将用户控件放在 same 应用程序内的其他文件中。最初的问题要求多个应用程序能够共享相同的用户控件。
    • 我明白了。好吧,我实际上并没有测试这个。但想法是应用程序之间共享文件夹的路径将通过MasterLocationFormatsViewLocationFormats 属性设置。这些共享控件将在该文件夹中。
    • 理论上这是个好主意,但不幸的是 ASP.NET 将拒绝从应用程序目录之外加载内容(出于安全原因)。这就是您需要将虚拟路径映射到两个文件夹的原因:它确保所有路径都作为子文件夹映射到应用程序的主文件夹。
    【解决方案2】:

    我不确定如何实现,但必须有一种方法可以在 DLL 中编译页面并共享库。

    但如果您负担得起使用自定义视图引擎和另一个模板系统(例如 Stringtemplate),那么您可以像共享库一样共享视图:

    【讨论】:

      【解决方案3】:

      要在多个 ASP.NET 应用程序之间共享用户控件(或几乎任何内容),您可以使用此处列出的技巧:http://aspadvice.com/blogs/ssmith/archive/2006/10/05/Tip_3A00_-Share-User-Controls-Between-Applications-in-ASP.NET.aspx

      基本思想是将 ASCX 文件放在一个文件夹中,并将该文件夹放入其他应用程序的虚拟文件夹中(您可以有多个虚拟文件夹指向同一个物理文件夹)。

      【讨论】:

        最近更新 更多