正 文

ASP.NET 2.0的新增服务、控件与功能


www.7dspace.com 更新日期:2006-5-17 22:30:40 七度空间 免费5位qq号码 免费Q币


  新的动态编译模型

  ASP.NET 1.x中引入的众多创新之一是:系统能够在首次访问您的代码时对其进行编译。但是,只有页面能够被自动编译,并且辅助类(如数据访问组件)必须单独编译。

  ASP.NET 2.0扩展了动态编译模型,以便能够自动编译几乎所有的组件。bin目录仍然保留以便实现向后兼容性,但它现在添加了名为Code和Resources的目录。Code目录中的C#和Visual Basic文件以及Resources目录中的RESX和RESOURCE文件被ASP.NET自动编译并缓存在系统子目录中。此外,落入Code目录中的Web服务描述语言(WSDL)文件被编译为Web服务代理,而XML架构定义语言(XSD)文件被编译为类型化数据集。通过Web.config,还可以扩展这些目录以支持其他文件类型。

  预编译并且在不带源代码的情况下进行部署

  提到动态编译,与 ASP.NET 1.x有关的最常见问题之一是:是否可以预编译页面,以避免在首次访问页面时发生的编译延迟?尽管该问题本身在某种程度上无关紧要(延迟非常小,并且延迟的开销被成千上万甚至数以百万的后续请求所分摊),但Microsoft仍然感到有必要采取相应的措施来减轻开发人员的担忧。这一“措施”就是能够通过提交对名为precompile.axd的幻像资源的请求,来预编译应用程序中的所有页面。

  但预编译并不仅限于此。另一个经常被请求的功能是:能够将整个应用程序预编译为可以在不带源代码的情况下进行部署的托管程序集(该功能在宿主方案中尤其有用)。ASP.NET 2.0包含一个名为Aspnet_compiler.exe的新的命令行工具,它能够执行预编译并且在不带源代码的情况下进行部署;Visual Studio 2005将包含类似的功能。下面的命令将预编译Web1目录中的应用程序,并且在不带源代码的情况下将其部署到Web2:

Aspnet_compiler -v /web1 -p c:\web1 c:\web2

  之后,目标目录将包含空的ASP.NET文件(ASPX、ASCX、ASIX等等)以及源目录中存在的所有静态内容(如HTML文件、.config文件和图像文件)的副本。在不带源代码的情况下进行部署并不会为您的知识产权提供牢不可破的保护,因为聪明的ISP仍然可以通过反编译生成的程序集来弄清楚应用程序的来龙去脉,但是,它确实对一般的代码窃取者设置了更大的阻碍。

  新的代码分隔模型

   ASP.NET 1.x支持两种编程模型:内联模型—HTML和代码共存于同一个ASPX文件中;代码隐藏模型—它将HTML分隔到ASPX文件中,并将代码分隔到源代码文件(例如,C#文件)中。ASP.NET 2.0引入了第三个模型:一种新的代码隐藏形式,它依赖于Visual C#和Visual Basic .NET编译器中的不完全类支持。新的代码隐藏解决了原来的代码隐藏中存在的一个恼人的问题:传统的代码隐藏类必须包含受保护的字段,这些字段的类型和名称需要映射到ASPX文件中声明的相应控件。

  代码7 显示了新的代码隐藏模型的工作方式。Hello.aspx包含页面的声明部分,Hello.aspx.cs包含代码。您应该注意@ Page指令中的CompileWith属性。此外,请注意MyPage类中缺少的字段(它们提供到ASPX文件中声明的控件的映射)。旧样式的代码隐藏仍然受支持,但新样式将是今后的首选编程模型。一点都不奇怪,Visual Studio 2005天生就支持新的代码分隔模型。

Hello.aspx

<%@ Page CompileWith="Hello.aspx.cs" ClassName="MyPage" %>

<html>
<body>
<form runat="server">
<asp:TextBox ID="Input" RunAt="server" />
<asp:Button Text="Test" OnClick="OnTest" RunAt="server" />
<asp:Label ID="Output" RunAt="server" />
</form>
</body>
</html>

Hello.aspx.cs

using System;

partial class MyPage
{
 void OnTest (Object sender, EventArgs e)
 {
  Output.Text = "Hello, " + Input.Text;
 }
}

代码7 Codebehind模型

  客户端回调管理器

  ASP.NET 2.0中我最喜欢的功能之一就是由新的客户端回调管理器提供的“轻量级回发”功能。在过去,ASP.NET页面必须回发给服务器才能调用服务器端代码。回发是低效的,因为它们将包含由页面控件生成的所有回发数据。它们还强制页面刷新,从而导致不雅观的闪烁。

  ASP.NET 2.0引入了客户端回调管理器,它使页面无需完全回发就可以回调到服务器。回调是异步的,并且通过XML-HTTP来完成。它们不包含回发数据,并且不会强制页面刷新。(在服务器端,页面像平常一样执行至PreRender事件,但在即将呈现任何HTML之前停止。)它们确实需要支持XML-HTTP协议的浏览器(这通常意味着Microsoft Internet Explorer 5.0或更高版本)。

  使用客户端回调管理器涉及三个步骤。首先,调用Page.GetCallbackEventReference以获取对某个特定函数(可以从客户端脚本中调用该函数,以执行到服务器的XML-HTTP回调)的引用。ASP.NET提供了该函数的名称和实现。其次,在客户端脚本中编写一个将在回调返回时调用的方法。方法名称是传递给 GetCallbackEventReference的参数之一。第三,在页面中实现ICallbackEventHandler接口。该接口包含一个方法—RaiseCallbackEvent,当回调发生时,该方法将在服务器端调用。RaiseCallbackEvent所返回的字符串将被返回到第二步所述的方法。

  代码8中的代码显示了客户端回调的工作方式,并且演示了它们的一个非常实际的用途。该页面显示了一个请求姓名和地址的窗体。在Zip Code字段中键入378xx或379xx邮政编码,然后单击Autofill按钮,City字段中将显示一个名称。值得注意的是,该页面会返回到服务器以获取城市名称,但它使用客户端回调而不是完全回发来完成此工作。在实际操作中,它可以找到某个数据库以将邮政编码转换为城市名称。请注意,该页面并不像页面在回发到服务器时通常所做的那样进行重新绘制。相反,更新是快速且简洁的!

<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<html>
<body>
<h1>Please Register</h1>
<hr>
<form runat="server">
<table>
<tr>
<td>First Name</td>
<td><asp:TextBox ID="FirstName" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>Last Name</td>
<td><asp:TextBox ID="LastName" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>Address 1</td>
<td><asp:TextBox ID="Address1" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>Address 2</td>
<td><asp:TextBox ID="Address2" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>City</td>
<td><asp:TextBox ID="City" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>State</td>
<td><asp:TextBox ID="State" RunAt="server" /></td>
<td></td>
</tr>
<tr>
<td>Zip Code</td>
<td><asp:TextBox ID="Zip" RunAt="server" /></td>
<td><asp:Button ID="AutofillButton" Text="Autofill"
RunAt="server" /></td>
</tr>
</table>
</form>
</body>
</html>

<script language="javascript">
// Function called when callback returns
function __onCallbackCompleted (result, context)
{
// Display the string returned by the server's RaiseCallbackEvent
// method in the input field named "City"
document.getElementById ('City').value = result;
}
</script>

<script language="C#" runat="server">
void Page_Load (Object sender, EventArgs e)
{
 // Get callback event reference (e.g., "__doCallback (...)")
 string cbref = GetCallbackEventReference (this,"document.getElementById ('Zip').value",
"__onCallbackCompleted", "null", "null");

 // Wire the callback event reference to the Autofill button with
 // an onclick attribute (and add "return false" to event reference
 // to prevent a postback from occurring)
 AutofillButton.Attributes.Add ("onclick",cbref + "; return false;");
}

// Server-side callback event handler
string ICallbackEventHandler.RaiseCallbackEvent (string arg)
{
 if (arg.StartsWith ("378"))
  return "Oak Ridge";
 else if (arg.StartsWith ("379"))
  return "Knoxville";
 else
  return "Unknown";
}
</script>

代码8callback.aspx

7页,页码:[1] [2] [3] [4] [5] [6] [7] 

上一篇:Yahoo!搜索里最热门关键词竟是Google
下一篇:Word入门动画教程105:用题注编制图表目录
ASP.NET 2.0的新增服务、控件与功能 作者: 来源:MSDN
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐