本文描述这个新的代码隐藏模型、它的基本原理,以及 Web 开发人员将如何使用它。并介绍该模型的一些潜在的副作用以及如何在设计中解决它们。请注意,ASP.NET 2.0 运行时完全支持 1.x 模型,因此针对 1.x 编写的应用程序可以在无需修改的情况下直接运行。
程序集生成的另一个技巧是,使用 aspnet_compiler 的 -fixednames 选项请求将每个 .aspx 文件编译为单独的程序集,该程序集的名称跨编译器的不同调用保持一致。如果您想更新单个页面而不修改部署站点上的其他程序集,这是很有用的。它也可以为任何大型站点生成大量程序集,因此您一定要在使用该选项之前测试您的部署。
如果您觉得这比较复杂,我可以告诉您它的优点,即您无需花费大量时间考虑将哪些文件映射为单独的程序集。.aspx 文件一直在最后进行编译,并一直包括对生成的所有其他程序集的引用,因此,无论您选择哪种部署模型,它通常都会正常工作。
在部署中,可能实际影响您在页面中制作代码的方式的一个重要区别是,当使用可更新部署时编译中的分离。当部署可更新站点时,代码隐藏文件在部署之前编译为单独的程序集。从 .aspx 文件生成的类不进行编译,除非作出对目录中文件的实际请求。这与二进制部署(其中所有文件在部署之前编译)以及源部署(其中所有文件在请求时编译)形成了鲜明对比。以下这一简单的示例解释这是如何引出问题的,请考虑图 7 中带有嵌入属性的用户控件(.ascx 文件),以及一个使用该控件并从其代码隐藏类设置该属性的相关页面。
MyUserControl.ascx
<%@ Control Language="C#"%>
<script runat="server">
public string Color
{
get { return (string)ViewState["color"] ?? "white"; }
set { ViewState["color"] = value; }
}
protected override void OnLoad(EventArgs e)
{
_mainPanel.BackColor = System.Drawing.Color.FromName(Color);
base.OnLoad(e);
}
</script>
<asp:Panel runat="server" ID="_mainPanel">
<h2>Some text</h2>
Other text
</asp:Panel>
Default.aspx
<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Src="MyUserControl.ascx" TagName="MyUserControl" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:MyUserControl id="MyUserControl1" runat="server">
</uc1:MyUserControl></div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Web.UI;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MyUserControl1.Color = "purple";
}
} |
图 7 中的页面将以源或二进制部署模式编译并运行,但是当作为可更新站点部署时将无法编译,原因是该用户控件 Color 属性的定义在部署时不可用(该限制也存在于 1.x 模型中)。要避免此类问题发生,通常您可以将所有代码放在代码隐藏文件中,或者干脆不使用代码隐藏文件,将代码直接放在 .aspx 和 .ascx 文件中。
有关文件到程序集映射的另一个注意事项是,使用内部关键字防止外部程序集访问类中的方法,这可能只在某些部署方案中奏效而在其他方案中却不然,这是因为存在不同的程序集映射选项。除非您提前计划要使用哪个部署选项,否则最好避免在页面中使用内部方法并继续使用类型范围的保护关键字:公共、受保护和私有。
小结
对于 ASP.NET 开发人员而言,ASP.NET 2.0 中的新代码隐藏模型既熟悉又陌生。之所以说熟悉是因为,它仍然使用继承将代码隐藏类与其 .aspx 生成的类定义相关联,而之所以说陌生是因为,诸如部分类这样的元素和控件成员变量声明的隐式生成都是基本的转换。实际上,您可能不会注意到用法上的许多差别,但是无论您何时进行非一般的操作(例如,创建一个通用基 Page 类,或者将代码隐藏与内联代码模型混合),了解本文描述的类关系和程序集映射都是很重要的。
查看本文来源