五、ASP.NET Web 服务器控件和浏览器功能
不同的浏览器和相同浏览器的不同版本支持不同的功能。ASP.NET 服务器控件会自动确定发出页面请求的浏览器,并为该浏览器呈现适当的标记。但是,部分控件功能无法在较低版本的浏览器上呈现,因此需要在尽可能多的浏览器类型上查看页的输出,以确保页以预期方式呈现在所有浏览器中。
1、浏览器类型的自动检测
默认情况下,ASP.NET 页框架可以读取请求期间从浏览器传递到服务器的用户代理信息,从而确定浏览器的功能。(此信息可用作 HttpRequest 对象的 UserAgent 属性。)页面会根据配置文件和浏览器定义文件中的代理项来匹配用户代理信息。
说明:配置文件 (.config) 的 browserCaps 节在 .NET Framework 2.0 版中已被否决。为了实现向后兼容性,如果本节中的配置设置是在应用程序级别设置的,则这些设置将仍然有效,但会与浏览器定义文件 (.browser) 中包含的信息合并到一起。浏览器定义文件位于计算机级别的 %SystemRoot%/Microsoft.NET/Framework/版本号/CONFIG/Browsers 文件夹以及任何现有应用程序级别的 App_Browser 文件夹中。
当页查找到当前用户代理信息和文件中列出的用户代理之间的匹配项时,它可以读取相应的浏览器功能,例如,该浏览器是否支持脚本撰写、样式、框架等等。页面上的控件会根据这些功能使用适当的标记(XHTML、HTML 3.2,等等)来呈现 Web 控件。如果 ASP.NET 在呈现 HTML 元素,它就可以确定是呈现较新版本(符合级联样式表)的 HTML 元素还是呈现早期版本(不符合级联样式表)的 HTML 元素。对于旧版浏览器,ASP.NET 将使用元素(例如,font 元素)而不是 CSS 样式来呈现格式设置信息。
2、重写浏览器类型检测
如果要显式控制页面的呈现方式,而不是依赖浏览器自动检测,则可以设置页面的 ClientTarget 属性 (Property)。可以通过声明方式将该属性 (Property) 设置为该页的 @ Page 指令的一个属性 (Attribute),也可以通过编程方式进行此项设置。
ClientTarget 属性的值是您想要用来呈现页的浏览器类型的别名。例如,若要强制页面通过 Microsoft Internet Explorer 6.0 来呈现,则可以使用别名 uplevel。此别名必须在配置文件的 clientTarget 节中定义。预定义的默认别名有 ie5、ie4、uplevel 和 downlevel。
通过指定别名 downlevel,可以强制页面呈现兼容 HTML 3.2 的元素,而不管是使用哪种浏览器请求了页面。同样,通过指定 uplevel,可以强制页面显示 CSS 样式属性,即使是旧版浏览器也显示。
可以通过在 Machine.config 或 Web.config 文件中定义其他别名来创建这些别名,这样您便能够创建自定义的浏览器定义。
3、支持 AJAX 的 ASP.NET 控件和功能
在 ASP.NET 中,支持 AJAX 的功能可与当今的大多数浏览器兼容,并使用这些浏览器的默认安全设置运行。这些控件和功能要求浏览器能够运行客户端脚本。UpdatePanel 和 ScriptManager 控件都是支持 AJAX 的控件的示例。
说明: 通过使用 HttpBrowserCapabilities 对象公开的属性,可以确定浏览器是否支持 ECMAScript(JScript、JavaScript)。
4、客户端脚本
ASP.NET 服务器控件的某些功能取决于是否能够运行客户端脚本。如果浏览器能够执行脚本,客户端脚本将自动生成并作为页的一部分发送。尽管如此,部分用户可能会在其浏览器中关闭脚本的执行,并将因此无法使用控件的全部功能。
5、使用早期版本的浏览器
浏览器分为两组,人们有时将它们称为“上级”浏览器(新版本)和“下级”浏览器(早期版本)。这两个组定义了浏览器提供的本机支持类型,通常也决定了网页的表示形式和行为。
通常情况下,被视为“上级”的浏览器至少支持以下内容:
·ECMAScript (JScript, JavaScript) 1.2 版。
·HTML 4.0 版。
·Microsoft 文档对象模型 (MSDOM)。
·级联样式表 (CSS)。
“下级”浏览器和客户端设备仅支持以下内容:
HTML 3.2 版
下表列出的服务器控件属性在上级和下级浏览器中的呈现情况有所不同。
服务器控件属性 | 在上级和下级浏览器中的呈现行为 |
AccessKey | 此属性在任何下级浏览器中对任何控件均无效。它不属于 HTML 4.0,仅在 Internet Explorer 4.0 或更高版本中有效。 |
BackColor | 此属性在下级浏览器中仅对某些特定控件有效,这些控件包括:Table、Panel、GridView、Calendar 和 ValidationSummary。如果布局位于 Table 控件中,则此属性对 CheckBoxList、RadioButtonList 和 DataList 控件也有效。总之,在 HTML 3.2 中,只有呈现为 table 元素的控件可以输出背景色,但在 HTML 4.0 中,几乎任何控件都可以。对于呈现 span 元素的控件,包括 Flow 模式下的 Label 控件、验证程序控件和列表控件,BackColor 在 Internet Explorer 5 或更高版本中有效,但在 Internet Explorer 4.0 中无效。 |
BorderColor | 此属性 (Property) 在下级浏览器中仅对与 BackColor 相同的基于表的控件有效。但是,它输出为 bordercolor 属性 (Attribute),该属性不是 HTML 3.2 标准的组成部分。部分浏览器支持这一属性,包括 Explorer 3.0 和更高版本,但并非所有浏览器都如此。 |
BorderStyle | 此属性在任何下级浏览器中均无效。HTML 3.2 中没有其对等属性。 |
BorderWidth | 此属性只在呈现为 HTML table 元素(Table、Panel、GridView 和 Calendar)或呈现为 img 元素(Image、AdRotator)的控件中有效。只有在按像素进行了指定的情况下,BorderWidth 才会在下级浏览器中有效;否则,它会始终以 border=1 或 border=0 的形式呈现。另外,只有将 GridLines 设置为 None 以外的值时,BorderWidth 才能和基于表的控件一起使用。这是因为无法在 HTML 3.2 中指定没有网格线的边界。对于呈现 span 元素的控件,包括 Flow 模式下的 Label 控件、验证程序控件和列表控件,BorderWidth 在 Internet Explorer 5 或更高版本中有效,但在 Internet Explorer 4.0 中无效。 |
CssClass | 无论在哪种浏览器上,此属性 (Property) 都呈现为 class 属性 (Attribute)。大多数上级浏览器都可识别 class 属性。 |
Enabled | 此属性 (property) 用于指定控件是否引发其事件和函数。在 Internet Explorer 4.0 或更高版本中,将 Enabled 设置为 false 与以下操作的效果相同:使用 disabled=true 属性 (Attribute),使控件显示为不可用,将其锁定而不允许输入。 |
Font-Bold、Font-Italic、Font-Strikeout 及类似属性 | 这些属性 (Property) 在上级浏览器中呈现为 style 属性 (Attribute)(例如,表示粗体的 Font-Weight 和表示斜体的 Font-Style),但在下级浏览器中则呈现为独立元素(例如,b 和 i)。 |
Font-Size | 只有在使用指定字体大小(小、较小等)的情况下,此属性才在下级浏览器中对所有控件都有效。在上级浏览器中,此属性 (Property) 呈现为 style 属性 (Attribute);在下级浏览器中,它呈现为 font 元素。 |
Font-Overline | 此属性在任何下级浏览器中均无效。 |
ForeColor | 此属性在下级浏览器中对 Image、AdRotator、HyperLink 和 LinkButton 之外的所有其他控件均有效。在下级浏览器中,ForeColor 通过 font 元素呈现。 |
Height | 此属性在下级浏览器中对 Label 控件、验证程序控件、HyperLink 控件或 LinkButton 控件均无效。另外,当 CheckBoxList、RadioButtonList 和 DataList 控件的布局被设置为 Flow 时,Height 属性也对这些控件无效。只有像素和百分比度量值有效。 对于基于表的控件,将不会为下级浏览器呈现内部表的高度,因为 Height 属性在 HTML 4.01 中已被否决。这会导致上级和下级呈现之间的外观稍有不同。如果对 SideBarStyle 属性设置了 BackColor,差别将最为明显:在上级浏览器中,BackColor 会显示为该列的整个长度,而在下级浏览器中,它将仅显示为容纳文本按钮所需的长度。 |
TabIndex | 此属性在任何下级浏览器中对任何控件均无效。它不属于 HTML 4.0,仅在 Internet Explorer 4.0 或更高版本中有效。 |
ToolTip | 此属性在任何下级浏览器中均无效。 |
Width | 此属性在下级浏览器中对 Label、HyperLink、LinkButton 或验证程序控件均无效。另外,当 CheckBoxList、RadioButtonList 和 DataList 控件的布局被设置为 Flow 时,Width 属性也对这些控件无效。只有像素和百分比度量值有效。 |
6、如何:在 ASP.NET 网页中检测浏览器类型
不同的浏览器和相同浏览器的不同版本支持不同的功能。在应用程序中,您可能需要确定用户正在使用哪种类型的浏览器查看页,并且可能需要确定该浏览器是否支持某些特定功能。
说明: ASP.NET 可以自动确定浏览器功能,并使用此信息为 ASP.NET 服务器控件呈现适当的 HTML 标记。
在 ASP.NET 页中检测浏览器类型
查询 Browser 属性,该属性包含一个 HttpBrowserCapabilities 对象。在 HTTP 请求过程中,该对象会从浏览器或客户端设备中获取信息,以便让您的应用程序知道浏览器或客户端设备提供的支持类型和级别。该对象随后使用强类型属性和泛型名称值字典公开有关浏览器功能的信息。
下面的代码示例演示如何在页上的文本框中显示浏览器信息。
private void Button1_Click(object sender, System.EventArgs e)
{
System.Web.HttpBrowserCapabilities browser = Request.Browser;
string s = "Browser Capabilities/n"
+ "Type = " + browser.Type + "/n"
+ "Name = " + browser.Browser + "/n"
+ "Version = " + browser.Version + "/n"
+ "Major Version = " + browser.MajorVersion + "/n"
+ "Minor Version = " + browser.MinorVersion + "/n"
+ "Platform = " + browser.Platform + "/n"
+ "Is Beta = " + browser.Beta + "/n"
+ "Is Crawler = " + browser.Crawler + "/n"
+ "Is AOL = " + browser.AOL + "/n"
+ "Is Win16 = " + browser.Win16 + "/n"
+ "Is Win32 = " + browser.Win32 + "/n"
+ "Supports Frames = " + browser.Frames + "/n"
+ "Supports Tables = " + browser.Tables + "/n"
+ "Supports Cookies = " + browser.Cookies + "/n"
+ "Supports VBScript = " + browser.VBScript + "/n"
+ "Supports JavaScript = " +
browser.EcmaScriptVersion.ToString() + "/n"
+ "Supports Java Applets = " + browser.JavaApplets + "/n"
+ "Supports ActiveX Controls = " + browser.ActiveXControls
+ "/n";
TextBox1.Text = s;
}
说明: HttpBrowserCapabilities 对象所公开的属性指示浏览器的内在功能,但不一定反映出当前的浏览器设置。例如,Cookies 属性指示浏览器是否内在地支持 Cookie,但不指示发出请求的浏览器是否已启用了 Cookie。