Mobile Web Application中的TextArea控件开发(二)

书接上篇,现在我们来讨论如何修改web.config文件,其实说起来,你也可以直接修改machine.config,但一般没有人建议这样做,最好最安全的方法,还是只修改某个WEB应用相关的web.config文件.
第三步,找到web.config中的MobileControls段落.修改成以下模样:
< mobileControls cookielessDataDictionaryType ="System.Web.Mobile.CookielessData" >
< device name ="htmlDeviceAdapters" inheritsFrom ="HtmlDeviceAdapters" >
< control name ="cn.sharetop.model.comm.MultiLineTextBox,cn.sharetop.model"
adapter
="cn.sharetop.model.comm.HTMLMultiLineTextBoxAdapter,cn.sharetop.model" />
</ device >
</ mobileControls >
第四步, 当然就是应用了,在你的Asp页面中,这样使用这个控件,先声明前缀和名域空间,以及程序集:
<% @RegisterTagPrefix = " myControl " Namespace = " cn.sharetop.model.comm " Assembly = " cn.sharetop.model " %>

然后,在页面加入我们自己的多行输入控件:
< mobile:form id ="Form1" runat ="server" >
< FONT face ="宋体" > &nbsp;
< myControl:MultiLineTextBox id ="mtextbox1" runat ="Server" Cols ="20" Rows ="6" Text ="me" ></ myControl:MultiLineTextBox >
</ FONT >
</ mobile:form >
OK,现在你用IE访问这个web application,会发现这个控件被正确解析成了<textarea>.
至此,我们的工作算是成功了一半.
但是马上你就会发现,为什么用手机访问根本没有变化,仍是一个单行输入的<input>,......我尝试了Openwave 7 和 Openwave 6.2 两个WAP模拟器,以及Nokia 6680和Sumsung X859两款手机,都不能得到想要的结果...
从模拟器可以看出,在Openwave 6.2 中,IIS返回的ContentType是 application/xhtml-xml,而Openwave 7中,却返回了text/vnd.wap.wml.....奇怪啊奇怪...
我就是在这点被卡住了,呵呵,主要是对web.config的配置不熟,里面的那些东西都是停留在"知其然,不知其所以然"的阶段...没办法,只好再Google了...
我的机器安装了DeviceUpdate 4.为了找出问题所在,我打开deviceupdate4.config 和 machine.config两个文件...经过仔细研究,也算是明白了个大概吧...
在web.config中增加的那个device段中有一个inheritsFrom="HtmlDeviceAdapters",我开始以 为这是一个类,结果在MSDN中却没找到,呵呵...原来它是定义在machine.config中的一个段落...说明,我现在web.config中 定义的htmlDeviceAdapters device来自于machine.config中的HtmlDeviceAdapters...而在HtmlDeviceAdapters中定义了各种 控件的实现,原来如此....
在machine.config中我发现了许多与xhtml相关的内容,都是update 4 增加进去了,既然IIS对Openwave 6.2 返回是xhtml的类型,那问题估计就出在这里了,我应该再增加一下针对xhtml的device,让它也去找我定义的新控件,于是,我把 web.config改成以下样子:
< mobileControls cookielessDataDictionaryType ="System.Web.Mobile.CookielessData" >
< device name ="xhtmlLDeviceAdapters" inheritsFrom ="XhtmlDeviceAdapters" >
< control name ="cn.sharetop.model.comm.MultiLineTextBox,cn.sharetop.model"
adapter
="cn.sharetop.model.comm.HTMLMultiLineTextBoxAdapter,cn.sharetop.model" />
</ device >
< device name ="wmlDeviceAdapters" inheritsFrom ="WmlDeviceAdapters" >
< control name ="cn.sharetop.model.comm.MultiLineTextBox,cn.sharetop.model"
adapter
="cn.sharetop.model.comm.HTMLMultiLineTextBoxAdapter,cn.sharetop.model" />
</ device >
< device name ="htmlDeviceAdapters" inheritsFrom ="HtmlDeviceAdapters" >
< control name ="cn.sharetop.model.comm.MultiLineTextBox,cn.sharetop.model"
adapter
="cn.sharetop.model.comm.HTMLMultiLineTextBoxAdapter,cn.sharetop.model" />
</ device >
</ mobileControls >
定义三个device段落,分别来自于HtmlDeviceAdapters,XhtmlDeviceAdapters和WmlDeviceAdapters,让这三种设备都使用我们定义的MultiLineTextBox控件...
终于,我在两个模拟器和我的X859上都正确看到想要的结果了....说明现在,IIS对Html的设备,Xhtml的设备,以及Wml的设备都允许使用这个自定义控件了...
但是,还有一个问题,为什么我的Nokia 6680,却仍不能显示呢?
继续,在deviceupdate4.config中,我找到了针对nokia手机的设备定义,有3650却没有6680,这个好办,改吧,其 实这两款手机差不多的,都是S60平台,屏幕也一样大...于是我新增了一个6680设备,内容就与3650一样即可...OK了,我的Nokia 6680也可以看到这个多行输入框了...同样道理,为什么Openwave 7的wml也可以通过这个方式修正...不过我没做,因为我需要一个wml的设备.
这件事的解决过程中,我走了一些弯路....也记下来,以警示自己!!!
1.当我发现IIS返回WML的时候,我尝试了让这个控件的Adapter直接派生于WmlTextBoxAdapter,并且,修改了 web.config中的inheritsFrom为WmlDeviceAdapters,在Openwave 7中成功,于是我想让IIS针对所有设备都输出WML...真是太直了...我把pageAdapter都设成wmlPageAdapter了...结果 IE一访问,咣当弹出一个下载对话框,....呵呵....
2.我一直以为,我可以在代码中强制输出的类型,结果发现不行,IIS判断设备,并响应合适的ContentType,不需要由代码控制的,全在两个config中配置(只是这两个config也太复杂了)......

你可能感兴趣的:(Web,mobile,IIS,Nokia,WAP)