使用 DisplayModeProvider 在 MVC5 Web 应用程序中的“桌面”、“平板电脑”和“手机”视图之间进行选择。据我了解,此类按顺序选择正确的提供者,并使用第一个返回 True 的提供者。但是,当我单步执行代码时,我发现在决定正确的模式之前,代码中有一个重复的循环(它会经历多次,有时超过 10 个循环)。我正在使用 WURFL Cloud 进行设备检测。最后,我已经开始将 WURFL 结果缓存到 Session 变量中。认为我的代码和/或逻辑一定有问题。它在 VB.net 中,因为它是遗留项目的演变。第一个代码块在 global.asax 的 Application_Start 中。之前它在一个单独的类中,但将其移至全局。
DisplayModeProvider.Instance.Modes.Clear()
DisplayModeProvider.Instance.Modes.Add(New DefaultDisplayMode("Phone") With {.ContextCondition = Function(c) c.Request.IsPhone})
DisplayModeProvider.Instance.Modes.Add(New DefaultDisplayMode("Tablet") With {.ContextCondition = Function(c) c.Request.IsTablet})
DisplayModeProvider.Instance.Modes.Add(New DefaultDisplayMode("") With {.ContextCondition = Function(c) c.Request.IsDesktop})
我的理解是该函数将检查每个上下文条件并在第一个为真时停止。但是,如上所述,即使其中一个函数返回 True,代码也会重复执行。
这是我正在使用的扩展方法。它们驻留在一个模块中。错误处理代码是在 WURFL 云“感知到”中断后添加的。每个都装饰有以下内容: System.Runtime.CompilerServices.Extension
Public Function IsPhone(request As HttpRequestBase) As Boolean
Dim ans As Boolean
Try
If Not HttpContext.Current.Session("IsPhone") Is Nothing Then
ans = HttpContext.Current.Session("IsPhone")
Else
wsm = New WURFLServiceModel(New HttpContextWrapper(HttpContext.Current))
ans = wsm.IsPhone
HttpContext.Current.Session("IsPhone") = ans
End If
Catch ex As Exception
...
End Try
Return ans
End Function
Public Function IsTablet(request As HttpRequestBase) As Boolean
Dim ans As Boolean
Try
If Not HttpContext.Current.Session("IsTablet") Is Nothing Then
ans = HttpContext.Current.Session("IsTablet")
Else
wsm = New WURFLServiceModel(New HttpContextWrapper(HttpContext.Current))
ans = wsm.IsTablet
HttpContext.Current.Session("IsTablet") = ans
End If
Catch ex As Exception
...
End Try
Return ans
End Function
Public Function IsDesktop(request As HttpRequestBase) As Boolean
Return True
End Function
这是 WURFLServiceModel 的代码
导入 ScientiaMobile.WurflCloud.Device 公共类 WURFLServiceModel 私有 miSIOS 作为布尔值 私有 mIsTablet 作为布尔值 私人电话作为布尔值 私有 mResponse 作为字符串 私有 mErrors 作为字典(字符串,字符串) Private api_Key As String = "xxxxxxxxxxxxxxxxxxxxxxxxxx" Public Sub New(ByVal request As HttpContextBase) GetDataByRequest(请求) 结束子 公共子GetDataByRequest(上下文作为HttpContextBase) 暗淡配置 = 新 DefaultCloudClientConfig(api_Key) 暗淡管理器 = 新 CloudClientManager(config) 昏暗信息 = manager.GetDeviceInfo(context) mIsIOS = info.Capabilities("is_ios") mIsPhone = info.Capabilities("is_smartphone") mIsTablet = info.Capabilities("is_tablet") mBrandName = info.Capabilities("brand_name") mModelName = info.Capabilities("model_name") mErrors = info.Errors mResponse = info.ResponseOrigin 结束子 公共只读属性 IsDesktop 作为布尔值 得到 返回真 结束获取 结束属性 公共只读属性 IsIOS 作为布尔值 得到 返回 mIsIOS 结束获取 结束属性 公共只读属性 IsTablet 作为布尔值 得到 返回 mIsTablet 结束获取 结束属性 公共只读属性 IsPhone 作为布尔值 得到 返回手机 结束获取 结束属性
尽管应用程序运行时没有错误,但我无法相信应该会循环执行此例程。如果可能的话,想清除它。我究竟做错了什么?提前谢谢了!