书接上篇,现在我们来讨论如何修改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>
<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页面中,这样使用这个控件,先声明前缀和名域空间,以及程序集:
<%@ Register TagPrefix="myControl" Namespace="cn.sharetop.model.comm" Assembly="cn.sharetop.model" %>
然后,在页面加入我们自己的多行输入控件:
<mobile:form id="Form1" runat="server">
<FONT face="宋体">
<myControl:MultiLineTextBox id="mtextbox1" runat="Server" Cols="20" Rows="6" Text="me"></myControl:MultiLineTextBox>
</FONT>
</mobile:form>
<FONT face="宋体">
<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 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也太复杂了)......