我用Index.cshtml
和Index.Mobile.cshtml
创建了一个asp.net mvc应用程序。这些视图使用相同的控制器和动作。在开发中,我在手机上获得了移动视图,在桌面上获得了桌面视图。一切正常。
将应用程序部署到生产服务器后,一切都可以在智能手机上正常运行,直到我从台式机浏览器导航到页面。从台式机浏览器导航到该页面后,我将无法再在移动设备上获得移动视图。
我禁用和启用了缓存设置,但是无论哪种方式,我都有这种奇怪的行为。我想念什么吗?
编辑:
我有以下主题结构:
/Themes/DefaultTheme/Views/Cart/Index.Mobile.cshtml /Themes/OceanasTheme/Views/Cart/Index.cshtml
在我的自定义剃刀视图引擎中,我修改了ViewLocationFormats,简化了:
var customViewLocationFormats = new List<string>();
customViewLocationFormats.Add("~/Themes/DefaultTheme/Views/{1}/{0}.cshtml");
customViewLocationFormats.Add("~/Themes/OceanasTheme/Views/{1}/{0}.cshtml");
//override default view location
ViewLocationFormats = customViewLocationFormats.ToArray();
当我将Index.Mobile.cshtml
复制到OceanasTheme文件夹时,会出现相同的问题,除了每次在桌面上访问后都会从OceanasTheme获取Mobile.сshtml
。 (桌面从OceanasTheme获取Index.cshtml
)。
更新到MVC 5.2.7,并删除了Microsoft.AspNet.Mvc.FixedDisplayModes程序包。但这仍然行不通。
答案 0 :(得分:1)
RazorViewEngine正在使用DefaultViewLocationCache缓存视图。与手机首次请求后,.Mobile视图位置存储在缓存中。当使用桌面浏览器请求时,在缓存中找不到桌面版本,因此RazorViewEngine将尝试在磁盘上查找视图。它会在另一个文件夹中找到该视图,并将其存储在缓存中,但它还会检查该文件夹中是否存在移动设备。由于.Mobile不在此文件夹中,因此它将使用空路径覆盖缓存。
我通过创建IViewLocationCache的自定义实现来解决此问题。