Pet*_*ron 28 browser asp.net-mvc mobile overriding asp.net-mvc-4
尽管浏览器覆盖正确检测到被覆盖的移动设备,但ASP.NET MVC 4中的移动显示模式在大约一小时的正常运行时间后停止提供正确的视图.
回收应用程序池暂时解决了这个问题.
新的浏览器覆盖功能正确地允许移动设备查看站点的桌面版本,反之亦然.但经过大约一个小时的正常运行时间后,移动设备不再呈现移动视图; 仅呈现默认桌面Razor模板.唯一的解决方法是回收应用程序池.
奇怪的是,浏览器覆盖cookie继续运行.主_Layout.cshtml模板正确显示"移动"或"桌面"文本,具体取决于值ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice,但仍会呈现错误的视图.这让我相信问题在于DisplayModes.
有问题的行动没有被缓存:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
Run Code Online (Sandbox Code Playgroud)
我使用51Degrees进行移动检测,但我不认为这会影响被覆盖的移动检测.这是DisplayModesASP.NET MVC 4 Beta和开发人员预览的功能中的错误,还是我做错了什么?
这是我的DisplayModes设置Application_Start:
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
{
ContextCondition = context =>
context.GetOverriddenBrowser().IsMobileDevice
&& (context.Request.UserAgent.IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
|| context.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0
|| !context.Request.Browser.IsMobileDevice)
});
/* Looks complicated, but renders Home.iPhone.cshtml if the overriding browser is
mobile or if the "real" browser is on an iPhone or Android. This falls through
to the next instance Home.Mobile.cshtml for more basic phones like BlackBerry.
*/
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile")
{
ContextCondition = context =>
context.GetOverriddenBrowser().IsMobileDevice
});
Run Code Online (Sandbox Code Playgroud)
mar*_*ind 21
这是MVC 4中的一个已知问题(Codeplex:#280:Multiple DisplayModes - 缓存错误,将显示错误的View).这将在下一版本的MVC中修复.
在此期间,您可以在此处安装解决方案包:http://nuget.org/packages/Microsoft.AspNet.Mvc.FixedDisplayModes.
对于大多数应用程序,只需安装此软件包即可解决此问
对于定制注册视图引擎收集一些应用程序,你应该确保您引用 Microsoft.Web.Mvc.FixedRazorViewEngine 或 Microsoft.Web.Mvc.FixedWebFormViewEngine,而不是默认的视图引擎实现.
我不能谈论这个特定的堆栈(我仍然在 MVC2 中),但请检查您的输出缓存设置(在您的控制器或视图中 - 以及在您的应用程序和机器级别的 web.config 中)。我看到它最初对最初的几个用户有效,然后在 ASP 决定缓存时桌面浏览器就会出现,然后每个人都会获得相同的视图。因此,我们避免了输出缓存,希望稍后能解决这个问题。
| 归档时间: |
|
| 查看次数: |
11566 次 |
| 最近记录: |