.NET WAP开发中遇到的问题汇总,主要总结一下在.NET WAP开发下浏览器的兼容及相关问题的处理。针对的是WML1.1的规范。 设置Emptyok= “true” 这是个很通用的问题,也就是说,要对WAP下的输出进行文本内容替换。 data = data.Replace(”&”, “&”); 主要还是上面5个特殊字符的替换,空格是一个比较特殊的例子。下面我会具体解释. WML下的空格 不使用CData嵌套内容 IE下显示WAP页面 防止客户端手机缓存页面 手机客户端默认情况下可能会缓存经访问过的页面内容,这样有可能照常用户看到的内容不是更新的,所为一般情况,会要求客户端不缓存页面内容。在输入的内容页中添加如下<meta http-equiv=“Cache-Control” content=“no-cache”>即可。其原理和www网站类似。 WAP编码问题 Request参数读取 request["key"] 基本上就三种,第一种会自动判断是form还是query,但在WAP开发中需要明确指定request.form还是request.query,如果使用第一种在有些手机中将无法读取到参数值。这是个很迷惑的问题,但还是请指明读取的方式。 card包含P标签 也是手机兼容的问题。主要还是标签的写法上。如果直接在节点中输入内容,有些手机将无法正确读取。所以card下面至少要包含一个标签p。<card><p></p></card> 使用相对路径,而不是绝对路径 大概总结到这,目前我们已经升级到WAP2.0了,也碰到不少兼容的问题,还正在解决中,也希望大家有好的经验来分享。感觉相比WWW,Moile 市场的浏览器更是混乱。而且WAP2.0比WAP1.1的兼容问题,更麻烦。 就连同一型号,同样内置,同样版本的手机,也有兼容问题。
在WML中input 标签有一个emptyok的属性。表示用户可否不填输入框,默认为false,即要填,为true时可以不填。从理论上讲这是一个很好的属性,可以减少用户输入为空的判断。但实际运用中,首先不是所有手机浏览器支持,但最严重的问题是,一但你设置了emptyok=false,在有些手机中会将整个页面的 URL的链接点击都触发这个是否为空的判断。所以从兼容性的角度,请设置emptyok=true,在后代码进行判断。
WML实体替换
来自:http://www.w3school.com.cn/wap/wml_entities.asp
data = data.Replace(”\”", “”");
data = data.Replace(”‘”, “‘”);
data = data.Replace(”<”, “<”);
data = data.Replace(”>”, “>”);
从理论上空格只要替换成 这个实体就可以了。可有些手机中确直接显示 ,当然你不是很在意可以忽略。但这里可以提供一个好的解决办法,就是将空格替换成实体编码  这样基本上有空格的地方都显示正常了。
XML中的CData其实就是为了解决长文本中含有特殊字符的问题。但如果你希望通过<–!CData[]–>,而不是采用特殊字符替换成实体。你会发现有些手机浏览器,直接将这段内容不显示。所以,在目前的情况下,还是请使用WML实体替换吧。
大家都知道,在IE下如果直接访问WML1.1的WAP站点,会提示你文件下载。但如果你希望在IE下也可以正常访问WML1.1,而用户又不需要通过安装或设置,或是通过第三方网站。你可以通过URLRewrite的方式,只要IE访问的WAP1.1的站点请求的页面后缀是*.html,*.htm等的,同样可以直接访问WAP站点,而不会提示文件下载。
不累赘,可以参考 使用.NET进行WAP开发 一文
这个就要提到asp.net中参数读取问题。
request.form["key"]
request.query["key"]
这个问题的实质是因为使用了ASP.NET的自动支持Cookie的问题。在.NETWAP开发一文中,提到在不支持Cookie的手机中,ASP.NET会自动将当前的SeesionID隐藏在url中。这样如果你直接使用 “/search.aspx”,这样的绝对路径,将会丢失sessionid。所以在WAP的架构和设计上我们采用一层目录的概念,来简化开发中对 seesionid的处理。如果你使用.NET,并且希望更好的支持手机客户端,目前的经验使用相对路径是最好的选择。
···
···