更新:2007 年 11 月
适配器为特定的请求设备定义一组特性。假设您基于 Palm Pilot 设计新设备,并且要进行硬件修改和改进。若要为新设备开发 ASP.NET 移动网页,您需要使用自定义的设备适配器来充分利用增强的硬件功能集。
在 Web.config 文件内,将每个移动控件映射到您为其创建的自定义适配器。您不仅可以为特定于设备的自定义指定各个设备适配器集,还可以通过从其他适配器集继承设备适配器集来做进一步的自定义,从而自定义特定设备/控件组合的行为。
在 Web.config 文件内
若要映射移动控件和设备适配器,请以声明方式在 <system.web> 元素的 <mobileControls> 节中配置这些控件和设备适配器。您可以在 Web.config 文件中进行此操作,将更改隔离在给定应用程序中。整个服务器范围的设置位于您的 Microsoft Windows 目录下 .NET Framework 安装的 Machine.config 文件中。在配置文件中,您可以指定在运行时选择的各个适配器集。
![]() |
---|
如果 <mobileControls> 节当前不存在于 Web.config 文件中,则可在任何位置添加该节,作为 <system.web> 元素的子级。 |
声明适配器集
设备适配器集是 Web.config 文件内的映射机制。对于每个使用自定义设备适配器的控件,您必须在设备适配器集内包含下列信息:
谓词类
谓词方法
页适配器
控件的名称和关联的设备适配器
若要将设备适配器集添加到应用程序的 Web.config 文件中,必须使用 Web.config 文件的 <mobileControls> 节中的 <device> 元素声明一个设备适配器集,如下面的代码示例所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<!-- Other settings previously specified reside here. -->
<mobileControls>
<device name="myDeviceAdapter"
predicateClass="fullyQualifiedAdapterClass"
predicateMethod="specificMethodToInvoke"
pageAdapter="fullyQualifiedPageAdapter">
<control name="fullyQualifiedControl"
adapter="fullyQualifiedPageAdapter"/>
<!-- Add additional control names here. -->
</device>
</mobileControls>
</system.web>
</configuration>
定义设备属性
如前面的代码示例所示,您必须在每个适配器集中包含下表中定义的属性。
项 |
定义 |
---|---|
name |
唯一地标识设备适配器集。 |
(可选)指示当前设备适配器集从其他适配器集(由名称标识)继承。父设备适配器集可以位于同一个 Web.config 文件的相同 <mobileControls> 节中的任意位置,也可以位于父 Web.config 文件中。 |
|
指向一个被调用来计算适配器集是否适合当前设备的静态方法。该方法采用类型为 HttpContext 的单个参数,并返回一个布尔值,指示该适配器集是否适用。该方法可以使用所提供的 HttpContext 对象的 Browser 属性(它返回 MobileCapabilities 对象)检查目标设备的功能。 |
|
标识设备集的页适配器类,即实现 IPageAdapter 接口的类型。 |
如果 <device> 节包含 InheritsFrom 属性,则您不需要声明 PredicateClass、PredicateMethod 或 PageAdapter 属性。相反,设备适配器集可以从父设备适配器集定义继承这些属性。
![]() |
---|
虽然这些属性是不必要的,但您可以在应用程序需要时定义它们。 |
可以在一个适配器集中放置任何数量的 <control> 元素。每个元素提供一个特定的控件适配器映射(实现 IControlAdapter 的类)。<control> 元素具有两项属性:name 属性指定要映射的控件的类,adapter 属性指定控件适配器的类。
映射注意事项
虽然控件和适配器之间存在一一映射关系,但不必为每个控件/设备组合编写单独的控件适配器类。通常,如果新的移动控件使用继承或简单组合,并且不需要自定义的输出,它将不需要控件适配器。请考虑下面列出的其他情况:
一个适配器或适配器集可能会适用于常规的设备类型。例如,所有 HTML 3.2 设备可能会具有相同的设备适配器集。然而,对于某些控件,可能有更专用的设备适配器用于更特定的设备。例如,您可能想编写一个 Pocket PC 专用的 Calendar 控件设备适配器。
控件适配器可能会与控件基类(而不是各个控件)相关联。例如,一个适配器可能足以呈现从 BaseValidator 类继承的所有验证程序控件。
可以编写不使用设备适配器的全功能移动控件。但是,我们极力建议开发人员只要适用就编写设备适配器,因为如果页上的任何单个控件不使用设备适配器,就会失去体系结构的许多灵活性。
通过扩展现有控件新建的控件不需要设备适配器,因为使用了被包含控件的适配器。这些现有控件包括:用户控件、复合控件、通过继承创建的控件和包含现有控件的控件。
了解设备适配器选择过程
下面的过程描述如何选择页的设备适配器集:
按照 Web.config 文件中 <device> 节的定义,ASP.NET 循环访问设备适配器集的集合。首先检查与所请求的页最接近的 Web.config 文件,然后依次检查在配置层次结构中处于更高位置的各个 Web.config 文件。最后检查 Machine.config 文件。
使用 predicateClass 和 predicateMethod 属性来计算每个设备适配器集的关联谓词。
每个谓词使用所提供的 HttpContext 对象来检查目标设备的设备功能,并返回 true 或 false 来指示设备适配器集是否适用。
只要有任何谓词返回 true,即认为该设备适配器集是被选定的。此时,系统使用 <device> 元素的 pageAdapter 属性来确定创建哪个类的实例并创建适配器。
如果 Web.config 文件中的谓词都没有返回 true,则将为父目录的 Web.config 文件中的设备适配器集重复此过程。
对于每一个控件,将调用页来提供指定控件类型的设备适配器。ASP.NET 使用以下步骤来选择适当的控件适配器:
所使用的设备适配器集与为页的设备适配器选择的适配器集相同。
如果设备适配器集包含直接将控件类映射到设备适配器类的 <control> 元素,则将创建指定适配器类的实例。
如果无法直接映射设备适配器集,则将为控件创建基类的新实例。
此过程将一直重复,直至达到基类 Control 为止。如果在任何时候找到了直接映射,则将创建指定设备适配器类的新实例。
如果仍未找到映射,并且设备适配器集从其他适配器集继承,则将为父适配器集重复适配器选择步骤。此过程将沿着适配器集的层次结构向上执行,直至找到映射。
查找的结果会缓存起来,因此只需要为第一个相关控件执行一次指定的查找。上述的行为将保留下来。