我目前有一个.net mvc3应用程序,该应用程序负责在多个位置管理相似的 View ,这些位置也使用相同的 Controller ,例如site1/v1/views/index.cshtmlsite1/v2/views/index.cshtml

处理此问题的方法是,创建一个从DefaultControllerFactory继承的CustomControllerFactory,并在CreateController方法中,清除现有的 View 引擎,并添加一个新的自定义viewEngine,以根据当前url指定 View 位置格式。

如果用户登陆site1.com/v1/index.cshtml,则 View 引擎将指定以下位置的 View 位置:

string versionDirectory = "v1";
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml",
                             "/Views/{0}.cshtml",
                             "~/Shared/{0}.cshtml"
                            };

我遇到的问题是,如果多个用户大致同时在不同的页面上登陆,则所有用户都将看到相同的 View 。

Initially i thought this was related to caching,但是在自定义viewEngine中显式设置usecache = false之后,似乎这与ViewEngines class not being thread safe有更多关系。

有人对我如何实现相同的结果但以不同的方式有任何想法吗?

提前致谢。

最佳答案

ViewEngines集合是静态集合,因此其值在请求之间共享。您尝试做的事情是可能的,但是您做事的方式是不正确的。

一种简单的方法是编写一个自定义 View 引擎,该引擎从RazorViewEngine派生并覆盖FindView方法。每个请求一次调用该方法。在您的实现中,调用base.FindView,然后修改结果(如果不为null)以包括所需的站点信息。

Scott Hanselman的博客文章显示了一个示例,该示例通过自定义 View 引擎在另一个位置查找 View 。 http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

09-19 08:15