更新:2007 年 11 月
在呈现阶段,所有 ASP.NET 移动设备适配器都使用继承自 MobileTextWriter 基类的一个类来编写它们的输出。文本编写器的实际类可以特定于目标设备;页适配器实例化并返回适当的编写器。例如,对于需要 cHTML 标记的设备,ChtmlPageAdapter 将从它的 CreateTextWriter 方法中返回一个 ChtmlMobileTextWriter 对象。
MobileTextWriter 类为适配器定义一组常用的属性和方法。您可以为控件适配器定义特定于该适配器的编写器类的其他帮助器成员。HtmlTextWriter 基类的方法(如 Write、WriteLine 和 WriteBeginTag)可用,因为 MobileTextWriter 类继承自 HtmlTextWriter 基类。
强类型呈现方法
适配器通常需要特定类的文本编写器。例如,WmlPageAdapter 需要使用 WmlMobileTextWriter 对象。IControlAdapter 接口的 Render 方法包括一个 HtmlTextWriter 类型的参数。因此,适配器应该重写 Render 方法使所需的文本编写器类可以使用,或者将编写器强制转换为所需的类。
下面的示例演示如何重写自定义 CarControl 类的 XHTML 适配器集中新适配器的 Render 方法。该自定义适配器的名称为 XhtmlCarControlAdapter,它遵循了用于新适配器的既定命名规则。
// Specialized XhtmlCarControlAdapter Render method
public void Render(XhtmlMobileTextWriter writer)
{
... [rendering code]
}
// Generic XhtmlCarControlAdapter Render method
public override void Render(HtmlTextWriter writer)
{
Render((XhtmlMobileTextWriter)writer);
}
开始和结束响应
在编写响应之前,页适配器必须调用其 Render 方法中的某些方法。下面是页适配器的典型操作顺序:
调用编写器的 BeginResponse 方法。
调用编写器的 BeginFile 方法,并传入页 URL 以及所需的数据内容类型(MIME 类型)。例如,HTML 页适配器将 text/html 作为内容类型传入。
呈现页(通常为活动窗体)。
调用编写器的 EndFile 方法。
调用编写器的 EndResponse 方法。
下面的代码示例演示 HTML 页适配器的一个简单的 Render 方法。
public override void Render(MobileTextWriter writer)
{
writer.BeginResponse();
writer.BeginFile(Page.Request.Url.ToString(), "text/html");
Page.ActiveForm.RenderControl(writer);
writer.EndFile();
writer.EndResponse();
}
输出编码
MobileTextWriter 类提供了对呈现内容进行编码的帮助器方法。编码方式由目标设备决定。例如,基于 WML 的设备要求对美元符号 ($) 进行编码。这些帮助器方法如下:
若要编写针对目标设备编码的文本,适配器可以调用编写器的 WriteEncodedText 方法。
若要编写目标设备的 URL(包括参数),适配器可以调用编写器的 WriteEncodedUrl 方法。
若要编写目标设备的 URL 参数(即 URL 中跟在用户代理字符串的查询符号 [?] 后面的部分),适配器可以调用编写器的 WriteEncodedUrlParameter 方法。
输出缓存
ASP.NET 网页支持页输出缓存。利用 @ OutputCache 指令可以对页进行缓存。
在移动网页中,必须设置缓存的输出,使其因目标设备而异。例如,如果运行用于 Pocket PC 的 Microsoft Internet Explorer 的设备请求页,则只有对于其他运行用于 Pocket PC 的 Internet Explorer 的设备,才应该缓存和返回结果输出。
默认情况下,HTTP 用户代理字符串控制缓存的移动网页的变化。但是,其他设备的输出可能受其他属性的影响。例如,一个具有单个用户代理字符串的设备可能有多个屏幕大小设置,其中每个设置可以有不同的输出。为允许这些变化,页适配器可以重写 CacheVaryByHeaders 属性。
ASP.NET Web 用户控件还支持 @ OutputCache 指令,该指令允许单独缓存各个控件的输出。这被称为“部分缓存”。但是,移动网页中的用户控件不支持该指令。移动网页不支持部分缓存,因为用户控件的输出会因页中的其余内容而异。