gpt4 book ai didi

mobile - MVC5 DisplayModeProvider 注册问题

转载 作者:行者123 更新时间:2023-12-02 03:25:40 25 4
gpt4 key购买 nike

所以我有一个 mvc 5 应用程序,具有 3 种显示模式:桌面(默认)、移动设备和平板电脑。我正在使用 WURFL 来找出设备。以下是从 global.cs 调用进行注册的代码:

public static void RegisterDisplayModes(IList<IDisplayMode> displayModes){
var datafile = HttpContext.Current.Server.MapPath(WurflDataFilePath);
var configurer = new InMemoryConfigurer().MainFile(datafile);
var manager = WURFLManagerBuilder.Build(configurer);
HttpContext.Current.Cache[WURFLMANAGER_CACHE_KEY] = manager;

bool mobileEnabled = ConfigurationManager.AppSettings["EnableMobileSite"] == "true";
bool tabletEnabled = ConfigurationManager.AppSettings["EnableTabletSite"] == "true";

var modeDesktop = new DefaultDisplayMode("") {
ContextCondition = (c => c.Request.IsDesktop())
};
var modeMobile = new DefaultDisplayMode("mobile"){
ContextCondition = (c => c.Request.IsMobile())
};
var modeTablet = new DefaultDisplayMode("tablet"){
ContextCondition = (c => c.Request.IsTablet())
};

displayModes.Clear();
if (mobileEnabled) displayModes.Add(modeMobile);
if (tabletEnabled) displayModes.Add(modeTablet);
displayModes.Add(modeDesktop);
}

我正在使用 HttpRequestBase 的一些扩展方法,如 http://msdn.microsoft.com/en-us/magazine/dn296507.aspx 中所述。 :

public static bool IsDesktop(this HttpRequestBase request){
return true;
}
public static bool IsMobile(this HttpRequestBase request) {
return IsMobileInternal(request.UserAgent) && !IsForcedDesktop(request);
}
public static bool IsTablet(this HttpRequestBase request) {
return IsTabletInternal(request.UserAgent) && !IsForcedDesktop(request);
}

public static void OverrideBrowser(this HttpRequestBase request, bool forceDesktop){
request.RequestContext.HttpContext.Cache[OVERRIDE_BROWSER_CACHE_KEY] = forceDesktop;
}

public static bool IsForcedDesktop(this HttpRequestBase request){
var isForced = request.RequestContext.HttpContext.Cache[OVERRIDE_BROWSER_CACHE_KEY];
return isForced != null ? isForced.ToString().ToBool() : false;
}

private static bool IsMobileInternal(string userAgent) {
var device = WURFLManagerBuilder.Instance.GetDeviceForRequest(userAgent);
if (device.IsTablet() == true) {
return false;
} else {
return device.IsMobile();
}
}

private static bool IsTabletInternal(string userAgent) {
var device = WURFLManagerBuilder.Instance.GetDeviceForRequest(userAgent);
return device.IsTablet();
}

一段时间内一切正常,但大约一个小时后,移动和平板设备开始显示桌面 View ,桌面 View 开始显示 ViewSwitcher 共享 View (我想大多数人都熟悉它,它仅允许您从移动设备显示桌面 View )。这几乎就像 mvc4 中的缓存错误。我尝试删除代码来注册显示模式,然后使用默认的 mvc 移动支持, 工作正常 它也有同样的问题!很明显这里某个地方存在问题......有人能看到任何明显的东西吗?几乎不可能调试,导致问题在很长一段时间后才开始出现,而且即使这样也只能在实时系统上出现!有什么想法吗?

非常感谢...解决这个问题已经太久了...干杯安迪

编辑:即使将其直接剥离回默认实现也会产生问题。我添加了一些调试代码以确保我实际上正在运行 mvc5,但看起来我确实在运行。我还尝试了最初建议的解决方法,通过禁用缓存来解决 mvc4 上的问题,但仍然没有效果。真的没有人知道这方面的信息吗?

最佳答案

所以我终于明白了。像往常一样非常简单。由于某种原因,当有人想要完整 View 而不是移动 View 时,我使用 RequestContext.HttpContext.Cache 来保存状态。我从未使用过 HttpContext.Cache,我很确定我会从某个博客中获取它 - 但现在找不到它了。所以所发生的一切就是它会改变每个人的观点,而不仅仅是一个人。不敢相信花了几周时间才弄清楚这一点。希望它能在某个时候对其他人有所帮助。

关于mobile - MVC5 DisplayModeProvider 注册问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22035770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com