找我

Mobile Web Development学习小结

近来,公司准备开发一个手机网站,之前在上家公司的时候有项目组做过,但是咱没机会见识,只记得有个手机模拟器挺帅的。所以只能临时抱佛脚,赶紧的百度共google齐飞,博客园共msdn一色。

首先是概念行的问题,手机网站,用这个关键字去搜,大多数都是广告,再加上.net,更没谱。想了半天,移动互联网?搜一下不对,那是xx store的范畴;最后,

在搜索的过程中确定了Mobile Web Development这么个关键词。

接下来就是开发环境的配置,这个vs必须有,然后基于vs的wap开发,网上看了一下有人介绍用新建智能设备->移动web应用的项目就行,但是关键是vs2008找不到这个项目类型呀,再一看,人家用的是vs2003,接着搜Mobile Web Development+vs2008,这回有谱了,有人详细介绍了究竟是怎么回事。详见这篇文章

原来,微软在设计vs2005/vs2008的时候,把移动web应用给刨除去了,好在可以下载对应的模板,放在“我的模板”下即可

下载链接为:下载链接,文件中的readme文件写了如何放到“我的模板”下

弄完了模板,点击创建项目,没有移动web应用的项目呀,仔细再看了一遍上面文章的demo图片,貌似没提项目的事,难不成用普通的网站项目就行?试了一下,果然可以(为什么呢?这个待会就明白了),然后删掉default.aspx,新建项目->我的模板->移动web窗体,果然看到了曙光,终于完成了一步呀。

接着该捣鼓测试环境了,移动web应用可以用vs自带的工具->仿真器设备管理器里面的随便一种仿真器来测试,我选择的是windows mobile 5.0 Pocket PC R2 Emulator,因为我的手机就是wm6.5的系统,操作起来较熟悉。选择仿真器类型,然后操作->连接,开机时一如既往的慢,然后熟悉的wm系统界面。既然开了机,就看看wap网站吧,熟悉熟悉。打开仿真器里面的ie,输入wap.sina.com,提示上不了网。要使用微软的ActiveSync,我的是win7的系统,自带windows mobile设备中心,不用下载ActiveSync。按照文章的提示,操作->插入底座,这时ActiveSync/windows mobile设备中心会提示连接,点击不设置联系人..直接连接,此时会显示成已连接。再次访问wap.sina.com,还是不成功。看了下文章,没有其他的了,后来想到我是局域网,使用代理上网,会不会这个原因呢?点击手机的连接设置—>勾选手机上网,然后设置手机的代理服务器与电脑的代理服务器一致,保存,再次访问,终于成功了。

回转到vs,这时候用手机访问你的程序是访问不了的,看看作者的另外一篇文章这篇文章,就明白了,对于服务器来说,无论是web应用程序还是mobile web应用程序都是一样的东西,不同的只是在输出的文件格式上面,web应用程序输出的是html,而mobile web应用程序输出的是wml。这也就解释了为什么web的项目模板,可以创建mobile web application。按照两片文章的提示,要在web.config的system.web下(就是在system.web的根内),拷贝一段,这里我拷贝的是后一篇文章提到的内容,因为用的少错的少么。然后在iis中添加mime类型,因为我用的是iis7+虚拟目录的方式,虚拟目录继承了默认网站的mime类型,不用添加,直接掠过。然后编译,访问,没有什么问题。

期间去w3cschool看了一下wml的内容以及wmlscript,即.wml和.wmls,本来还想着学习的东西还挺多,结果现在这些都落伍了,可以只使用mobile web form来开发。

再回到测试环境,测试的时候总是要在那么小的仿真环境中测试总有些不爽。在刚才提到的后一个文章中提到了几款浏览器可以直接打开wml的网站,按照流行的说法,opera最方便,m3gate最严谨,opera我用了,很好用,但是m3gate不知道为什么总是打不开网站,也不报错,只能放弃。推荐使用opera,看着那巨大的O就高兴。

最后回转到代码,mobile web提供了控件库,有一些,但不多,我自己写了一段,贴出来大家看看:

aspx

 
 
cs code
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.Mobile;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.MobileControls;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace MobileWebApp
{
    
public partial class Login : System.Web.UI.MobileControls.MobilePage
    {
        
protected void Page_Load(object sender, EventArgs e)
        {
            Page.Response.Expires 
= -1;
            Response.CacheControl 
= "Public";
        }

        
protected void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs args)
        {
            System.Web.UI.MobileControls.CustomValidator cv 
= (System.Web.UI.MobileControls.CustomValidator)sender;
            System.Web.UI.MobileControls.TextBox tb 
= (System.Web.UI.MobileControls.TextBox)Form1.FindControl(cv.ControlToValidate);
            args.IsValid 
= tb.Text.IndexOf('@')>=0;
        }
        
protected void btnLogin_Click(object sender, EventArgs e)
        {
            
if (Page.IsValid)
            {
                
string sUserName = mTBLoginName.Text.Trim();
                
string sPass = mPassword.Text;
                mLabel.Text 
= string.Format("用户名:{0};密码:{1}", sUserName, sPass);
                mTV.Text 
= mLabel.Text;
                ActiveForm 
= Form2;
            }
        }
    }
}
这其中有些地方,我记下来留作以后回忆用:

1、BreakAfter=”true”,自动在控件后输出一个<br/>,否则不输出

2、没有button,要用command,我找到的带click的只有他了

3、mobile:Image的AlternateText是为了当无法显示图片时预留的显示文本

4、文本是没有颜色的,就别费力气设置forecolor和backcolor了,因为wml不支持颜色

还有就是前一篇文章提到的:

Page.Response.Expires = -1;
Response.CacheControl = "Public";

来取消移动设备缓存,并通过RedirectToMobilePage函数进行重定向。

以及后一篇文章提到的(这个没用到过):

1.传递多个参数时,不能用xxx.aspx?a=1&b=2 ,而要改成xxx.aspx?a=1&amp;b=2 ,否则在opera上无法解析

2.如果在MobilePage对应的aspx中,直接用<%="你的内容"%>,最终运行时将得不到任何输出,正确的办法是创建一个Mobile User Control,在控件里就可以这样用了,然后再把该控件放到页面里

3.Mobile控件中,没有Repeater控件,只能用Mobile:List控件来代替,但是这个东西,我个人觉得并不好用,还不如在后台直接生成字符串,然后利用2中的办法,放到自定义控件里输出

posted @ 2011-07-14 16:44  窃马贼  阅读(422)  评论(1编辑  收藏  举报