使用桌面访问页面后,移动设备将无法获得View.Mobile.cshtml视图

时间:2018-11-23 21:38:17

标签: asp.net asp.net-mvc-4

我用Index.cshtmlIndex.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程序包。但这仍然行不通。

1 个答案:

答案 0 :(得分:1)

RazorViewEngine正在使用DefaultViewLocationCache缓存视图。与手机首次请求后,.Mobile视图位置存储在缓存中。当使用桌面浏览器请求时,在缓存中找不到桌面版本,因此RazorViewEngine将尝试在磁盘上查找视图。它会在另一个文件夹中找到该视图,并将其存储在缓存中,但它还会检查该文件夹中是否存在移动设备。由于.Mobile不在此文件夹中,因此它将使用空路径覆盖缓存。

我通过创建IViewLocationCache的自定义实现来解决此问题。