Asp.net mvc 3 如何在ASP.NET MVC 3中组合静态视图和动态视图

Asp.net mvc 3 如何在ASP.NET MVC 3中组合静态视图和动态视图,asp.net-mvc-3,Asp.net Mvc 3,这是一个很难问的问题,没有一些背景知识,我试图做什么。我正在开发一个现有的多租户ASP.NET MVC 3应用程序(典型的数据表单应用程序),但现在必须为租户提供向任何页面添加自定义字段的功能。所有租户都有一组固定的页面,但他们可以在其中一个页面的任何位置添加字段。例如,在用户配置文件页面上,如果有字段可以输入您的地址,则租户可能希望在国家/地区字段之前添加县字段 每个租户的自定义字段配置存储在一个数据库中,该数据库包含描述字段内容(文本框、选择等)以及应呈现在何处的信息,如路径和应插入的字段i

这是一个很难问的问题,没有一些背景知识,我试图做什么。我正在开发一个现有的多租户ASP.NET MVC 3应用程序(典型的数据表单应用程序),但现在必须为租户提供向任何页面添加自定义字段的功能。所有租户都有一组固定的页面,但他们可以在其中一个页面的任何位置添加字段。例如,在用户配置文件页面上,如果有字段可以输入您的地址,则租户可能希望在国家/地区字段之前添加县字段

每个租户的自定义字段配置存储在一个数据库中,该数据库包含描述字段内容(文本框、选择等)以及应呈现在何处的信息,如路径和应插入的字段id

由于这是一个现有的应用程序,我有一些限制,希望保留所有现有的.cshtml视图作为所有租户的默认/基本视图。为了将特定于租户的字段添加到页面中,我创建了一个自定义VirtualPathProvider,它:

  • 从标准视图目录加载.cshtm文件中定义的标准视图
  • 从数据库加载视图的自定义字段定义(特定于发出请求的租户)
  • 对于每个自定义字段,创建Razor标记并将其插入步骤1中加载的视图中
  • 返回组合视图,该视图现在具有基本代码和租户特定代码
  • 这种设计对于视图的第一个请求很好,但是,来自任何租户的后续请求只返回第一个版本。我很确定这里发生的是ASP.NET运行时正在编译和缓存视图,因此下一个视图请求刚刚从缓存中出来


    最后是问题。如何覆盖编译和缓存,以便包含租户id之类的内容,以便每个租户缓存一次每个视图?

    我发现可以覆盖VirtualPathProviders的GetCacheKey方法来实现自己的密钥模式。在我的例子中,将租户的密钥添加到缓存密钥的末尾,如下所示:

    public override string GetCacheKey(string virtualPath)
    {
        var tenantKey = getTenantKey();
    
        if (VirtualPathHelper.SupportsCustomFields(virtualPath))
        {
            return string.Join("_", virtualPath, tenantKey);
        }
    
        return base.GetCacheKey(virtualPath);
    }
    
    在ASP.NET Internet临时文件目录中,该视图的文件名为: _视图_home_index.cshtml_a7c1a66a-ebe4-4ca2-8dc4-7a22b460f368.cshtml

    请求查看的每个租户现在都将获得自己的版本