5

我目前有一个 .net mvc3 应用程序,负责管理多个位置的类似视图,这些视图也使用相同的控制器,例如site1/v1/views/index.cshtmlsite1/v2/views/index.cshtml.

处理这种情况的方法是创建一个继承自 DefaultControllerFactory 的 CustomControllerFactory,并在 CreateController 方法中清除现有的视图引擎并添加一个新的自定义 viewEngine,它根据当前 url 指定视图位置格式。

如果用户登陆site1.com/v1/index.cshtml,视图引擎将指定 的视图位置:

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

我遇到的问题是,如果多个用户大致同时登陆不同的页面,所有用户都会看到相同的视图。

最初我认为这与缓存有关,但在自定义 viewEngine 中明确设置后usecache = false,似乎这与ViewEngines 类不是线程安全有关。

有没有人对我如何以不同的方式完成相同的结果有任何想法?

提前致谢。

4

2 回答 2

9

ViewEngines 集合是一个静态集合,因此它的值在请求之间共享。你试图做的事情是可能的,但你做的方式是不正确的。

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

Scott Hanselman 有一篇博客文章展示了一个通过自定义视图引擎在另一个位置查看视图的示例。http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

于 2011-02-19T04:56:41.450 回答
1

内置视图引擎是线程安全的。您的问题是缓存或您的自定义视图引擎。检查另一个答案中链接中的缓存注释。

于 2011-02-19T06:25:14.870 回答