如果没有关于我正在尝试做什么的背景,这是一个很难问的问题。我正在开发一个现有的多租户 ASP.NET MVC 3 应用程序(典型的表单数据应用程序),但现在必须为租户提供向任何页面添加自定义字段的能力。所有租户都有一组固定的页面,但他们可以在其中一个页面的任何位置添加字段。例如,在包含用于输入地址的字段的用户配置文件页面上,租户可能希望在 Country 字段之前添加 County 字段。
每个租户的自定义字段的配置存储在一个数据库中,其中包含描述字段是什么(文本框、选择等)以及应该在哪里呈现它的信息,例如应该插入的路由和字段的 id前。
由于这是一个现有的应用程序,我有一些限制,并希望将所有现有的 .cshtml 视图保留为所有租户拥有的默认/基础。为了将租户特定字段添加到页面中,我创建了一个自定义 VirtualPathProvider,它:
- 从标准视图目录加载 .cshtm 文件中定义的标准视图
- 从数据库加载视图的自定义字段定义(特定于发出请求的租户)
- 为每个自定义字段创建 Razor 标记并将其插入到从第一步加载的视图中
- 返回现在具有基本和租户特定代码的组合视图
该设计适用于第一个视图请求,但是,来自任何租户的后续请求只会返回第一个版本。我很确定这里发生的事情是 ASP.NET 运行时正在编译和缓存视图,因此对视图的下一个请求刚刚从缓存中出来。
所以最后的问题。如何覆盖编译和缓存,以便包含租户的 id 之类的内容,以便每个视图缓存一次每个租户?