ASP.NET MVC Display Mode 移动端视图 配置对微信内置浏览器的识别
最近在捣鼓一个稍微有点low的商城网站,没有计划做app却要求有个wap版,而前端又没有做成响应式,时间WTF,直接利用了asp.net mvc的Display Mode Provider。
使用方式依照上面的链接地址,asp.net mvc application启动的时候会在全局变量 DisplayModeProvider.Instance.Modes 集合中加入 DisplayModeId == "Mobile" 的 IDisplayMode ,因此如果想要在移动端浏览器中展示移动视图只需要添加对应的以 .Mobile.cshtml 结尾的视图文件就可以了;可以通过chrome浏览器F12模拟移动端进行测试。
通过查看mvc源码发现IDisplayMode的默认实现为 DefaultDisplayMode ,它通过 HttpContext.GetOverriddenBrowser().IsMobileDevice 来判断是否为移动端,如果Controller需要针对pc端及mobile端做不同处理可以通过这种方式来判断,其他方式可能会造成两边不一致。
从GetOverriddenBrowser这个命名可以看出它的判断结果是可以通过某种方式改变的,也就是视图切换,实现如下:
public RedirectResult SwitchView(bool mobile, string returnUrl)
{
if (Request.Browser.IsMobileDevice == mobile)
HttpContext.ClearOverriddenBrowser();
else
HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop); return Redirect(returnUrl);
}
在做的过程中我就在考虑,web server判断web client无非是通过传过去userAgent字符串,.net framework原生不可能准确判断每一种移动端设备,顶多预存了一些比较普遍的浏览器的userAgent;果不其然,在微信内置浏览器中打开呈现的是pc版的视图。再次定位到HttpContext.GetOverriddenBrowser().IsMobileDevice,其值在未被重写的时候是直接通过 Request.Browser.IsMobileDevice 得到的,它的结果由来是通过 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers 中的配置文件来决定的:

里面的配置是xml格式,通过命名可以大致猜出含义,我唯一不明白的是里面browser节点和gateway节点的区别;很奇怪,这一块的知识国内搜索引擎基本搜不到,fan墙google勉强找到一篇介绍这个的https://www.codeproject.com/Articles/1088703/How-to-detect-browsers-in-ASP-NET-with-browser-fil,写的比较详细,按照该作者对Edge浏览器的配置,写了一个wechat.browser:
<browsers>
<!-- mozilla/5.0 (linux; u; android 4.1.2; zh-cn; mi-one plus build/jzo54k) applewebkit/534.30 (khtml, like gecko) version/4.0 mobile safari/534.30 micromessenger/5.0.1.352 -->
<browser id="WechatInAndroid" parentID="Chrome">
<identification>
<userAgent match="MicroMessenger" />
<userAgent match="Safari" />
</identification> <capabilities>
<capability name="isMobileDevice" value="true" />
<capability name="mobileDeviceManufacturer" value="Google" />
<capability name="mobileDeviceModel" value="Android" />
<capability name="canInitiateVoiceCall" value="true" />
</capabilities>
</browser>
</browsers>
wechat内置浏览器的userAgent比较另类,android中都还有safari;其中MicroMessenger是它特有的,判断有这个就将isMobileDevice设置为true就行了。上面写的有点偷懒,都没有使用正则判断出版本号,也没有过滤桌面版微信~
在web项目中新建App_Browsers文件夹然后将wechat.browser即可生效。
The End.
原文地址:http://www.cnblogs.com/CameronWu/p/6764045.html
ASP.NET MVC Display Mode 移动端视图 配置对微信内置浏览器的识别的更多相关文章
- asp.net微信内置浏览器下Session失效
问题记录:仅限安卓端微信内置浏览器,服务器集群设置了黏性Session,在Post请求时会强制走代理,导致出去的ip指向另一台服务器,黏性Session失效,用户状态无法保存. 目前想知道除了设置Se ...
- 关于微信内置浏览器安卓端session丢失问题
项目上线测试,发现微信安卓端存在用户登录无法验证session情况, 导致每次接口请求都无法识别,而苹果客户端不会出现此问题,非微信环境打开不会出现此问题,找到一些解决方案做下记录: 方案1: 由于微 ...
- asp.net MVC开发过程中,使用到的方法(内置方法及使用说明)
® 视图的返回使用案例: [HttpGet] [SupportFilter] public ActionResult UserTopic(string type, string TopPicId, s ...
- mint-ui 企业微信PC端内置浏览器 Picker 无法滚动
处理 在主JS代码之上附加以下代码 : <script> if (~navigator.userAgent.toLowerCase().indexOf('windowswechat')) ...
- Asp.net MVC 移除不用的视图引擎
Asp.net MVC 默认提供两个视图引擎,分别为: WebFormViewEngine 和 RazorViewEngine.MVC在查找视图时,会按照指定的顺序进行查找.当我们的MVC程序未找到相 ...
- 8、ASP.NET MVC入门到精通——View(视图)
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官 ...
- ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项
引言: 本人想自己个博客网站出来,技术路线是用ASN.NET MVC5+EF6(Code First)+ZUI+各种Jquery插件,有了这个想法之后就开始选择UI,看了好多bootstrap的模板之 ...
- MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
- asp.net mvc bootstrap datatable 服务端分页
datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 先上图[ jqueryui风格] 前端代码: @{ Layout = null;} <!DO ...
随机推荐
- ORA-12557协议适配器不可加载
背景:以前电脑没有装ORACLE,仅是安装了简易客户端,此次想安装一个11g数据库,安装完成后用PLSQL登录,发现报错. 解决方案A:使用免安装的oracle客户端(instantclient_11 ...
- Holer下载
Holer下载 经常使用开源的holer将本地的应用映射到公网上访问,本文介绍如何下载holer软件包和注意事项,以及相关的帮助文档. 1. Java版本的holer软件包 格式: holer-cli ...
- IDEA日常遇到问题汇总
1. IDEA .gitignore文件不显示在项目栏中 解决方法,setting >> Editor >> Code Style >> File Type &g ...
- Node.js基础学习四之注册功能
前言:在Node.js学习(二)和(三)中介绍了如何在Node.js 中获取登录的用户名和密码与数据库进行验证并返回数据给客户端 需求:实现注册功能 为了区分登录和注册是两个不同的请求,在端口后面加上 ...
- springboot-yml内list、map组合写法
yml:myProps: varmaplist: key11: - t1 - t2 - t3 key22: - t11 - t22 - t33 list: - topic1 - topic2 - to ...
- 阿里云windows 2008 服务器处理挖矿程序 Miner
阿里云盾最近报发现wanacry蠕虫病毒和挖矿进程异常 仔细检查进程后,发现两个奇怪的进程 Eternalblue-2.2.0.exe,winlogins.exe 特别是伪装成 winlogins.e ...
- P4174 [NOI2006]最大获利(网络流)
P4174 [NOI2006]最大获利 还是最大权闭合子图的题 对于每个中转站$k$:$link(k,T,P_k)$ 对于每个用户$i$.中转站$A_i,B_i$.贡献$C_i$ $link(S,i, ...
- HBuilder 模拟器
模拟器名称 连接默认端口夜神安卓模拟器夜神安卓模拟器 62001逍遥安卓模拟器逍遥安卓模拟器 21503BlueStacks(蓝叠安卓模拟器)BlueStacks(蓝叠安卓模拟器 ...
- golang从文件按行读取并输出
package main import ( "fmt" "os" "bufio" "io" "time&quo ...
- concurrent.futures进行并发编程
Python中进行并发编程一般使用threading和multiprocessing模块,不过大部分的并发编程任务都是派生一系列线程,从队列中收集资源,然后用队列收集结果.在这些任务中,往往需要生成线 ...