我目前有一个.net mvc3应用程序,它负责管理多个位置的相似视图,这些位置也使用相同的控制器,例如site1/v1/views/index.cshtml和site1/v2/views/index.cshtml。
处理这种情况的方法是创建一个继承自DefaultControllerFactory的CustomControllerFactory,在CreateController方法中,清除现有的视图引擎并添加一个新的自定义viewEngine,该url指定基于当前url的视图位置格式。
如果用户登录site1.com/v1/index.cshtml,viewengine将指定以下内容的视图位置:
string versionDirectory = "v1";
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml",
"/Views/{0}.cshtml",
"~/Shared/{0}.cshtml"
};我遇到的问题是,如果多个用户在大致相同的时间登陆不同的页面,所有用户都会看到相同的视图。
Initially i thought this was related to caching,但在自定义viewEngine中显式设置usecache = false之后,这似乎与ViewEngines class not being thread safe有更多关系。
有没有人对我如何以不同的方式实现同样的结果有什么想法?
提前谢谢。
发布于 2011-02-19 12:56:41
ViewEngines集合是一个静态集合,因此它的值在请求之间共享。你尝试做的事情是可能的,但你做的方式是不正确的。
一种简单的方法是编写一个从RazorViewEngine派生的自定义视图引擎并覆盖FindView方法。该方法在每个请求中调用一次。在您的实现中,调用base.FindView,然后修改结果(如果它不为空)以包含所需的站点信息。
Scott Hanselman有一篇博客文章,展示了通过自定义视图引擎在另一个位置查找视图的一个示例。http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
发布于 2011-02-19 14:25:15
内置的视图引擎是线程安全的。你的问题是缓存或者你的自定义视图引擎。检查另一个答案中链接中的缓存注释。
https://stackoverflow.com/questions/5047172
复制相似问题