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

Asp.net 使用桌面访问页面后,移动设备将无法获得View.Mobile.cshtml视图,asp.net,asp.net-mvc-4,Asp.net,Asp.net Mvc 4,我用Index.cshtml和Index.Mobile.cshtml创建了一个asp.net mvc应用程序。视图使用相同的控制器和操作。在开发过程中,我在手机上看到移动视图,而桌面视图则是桌面视图。一切正常 在将应用程序部署到生产服务器后,智能手机上的一切都能正常工作,直到我从桌面浏览器导航到页面。在我从桌面浏览器导航到该页面后,我将不再在移动设备上获得移动视图 我禁用并启用了缓存设置,但无论哪种方式,我都有这种奇怪的行为。我错过什么了吗 编辑: 我得到了以下主题结构: /主题/Default

我用
Index.cshtml
Index.Mobile.cshtml
创建了一个asp.net mvc应用程序。视图使用相同的控制器和操作。在开发过程中,我在手机上看到移动视图,而桌面视图则是桌面视图。一切正常

在将应用程序部署到生产服务器后,智能手机上的一切都能正常工作,直到我从桌面浏览器导航到页面。在我从桌面浏览器导航到该页面后,我将不再在移动设备上获得移动视图

我禁用并启用了缓存设置,但无论哪种方式,我都有这种奇怪的行为。我错过什么了吗

编辑:

我得到了以下主题结构:

/主题/DefaultTheme/Views/Cart/Index.Mobile.cshtml /Themes/oceanasteme/Views/Cart/Index.cshtml

在我的自定义razor视图引擎中,我修改了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();
var customViewLocationFormats=new List();
添加(“~/Themes/DefaultTheme/Views/{1}/{0}.cshtml”);
添加(“~/Themes/oceanasteme/Views/{1}/{0}.cshtml”);
//替代默认视图位置
ViewLocationFormats=customViewLocationFormats.ToArray();
当我将
Index.Mobile.cshtml
复制到OceanAsteme文件夹时,会出现相同的问题,只是每次访问桌面后,我都会从OceanAsteme获取
Mobile.Сshtml
。(桌面从OceanAsteme获取
Index.cshtml


更新至MVC 5.2.7并删除了Microsoft.AspNet.MVC.FixedDisplayModes包。但它仍然不起作用。

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


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

请共享您的代码以获取更多详细信息。您是否关闭了缓存?你正在使用[OutputCache(Location=OutputCacheLocation.None,NoStore=true)]?你能分享一下你的代码吗?这将对遇到相同问题的任何人都非常有帮助。请参阅以获取参考:在InsertViewLocation方法中设置缓存之前,我刚刚创建了一个附加检查。