| 1. 概述   .NET 3.5和Visual Studio 2008的发布,在微软的.NET战略具有里程碑的意义,在Web开发方面,包含了一个具有强大功能的HTML 
              Web设计器,该设计器提供了分割视图编辑,嵌套母板页,以及完善的CSS集成,同时改进了对JavaScript的支持,包括智能提示和调试等。仅仅在.NET 
              3.5发布后的20天,微软推出了ASP.NET 3.5 Extensions第一个预览版本,正式版将会在2008年上半年发布,里面包括了更多的ASP.NET 
              的特性,主要有如下几个部分: (1) ASP.NET MVC 框架
 (2) ASP.NET AJAX改进
 (3) ASP.NET 动态数据支持
 (4) ASP.NET Silverlight支持
 (5) ADO.NET数据服务
  在本文中,我将通过几个简单的示例来展示ASP.NET 3.5 Extensions中的部分新特性。  2. ASP.NET MVC框架   MVC的概念,已经出现了很多年了,它将应用程序的实现分成三个部分,Model进行数据状态的保持,View进行用户界面的展现,Controller进行用来处理用户的交互,操作Model和选择View进行数据的显示。ASP.NET 
              MVC Framework中第一个关注点就是分离,以便方便的进行测试。同时它把aspx页、模板页、用户控件都当作View来使用,同时它还提供了非常强大的URL路由选择引擎,接下来我们通过示例来展示这些特性。 
              第一步:建立Model,使用LINQ to SQL类建立一个Product的数据模型  
 第二步:建立View,用一个aspx页面来显示Product的详细信息,页面继承于泛型的ViewPage: 
              
                | public partial class Product_Product : ViewPage<ProductInfo> {
 protected void Page_Load(object sender, EventArgs e)
 {
 }
 }
 |  在aspx页中显示数据,直接使用<%=%>标记输出: 
               
                | <div> <h2>ProductDetail:</h2>
 ProductId:<%= ViewData.ProductId %><br /><br 
                  />
 Name:<%= ViewData.Name %><br /><br />
 Descn:<%= ViewData.Descn %>
 </div>
 |  第三步:建立Controller,继承于Controller基类,并且添加Action方法,同时控制用Product视图来实现数据,并传入要显示的数据对象: 
               
                | public class ProductController : Controller {
 [ControllerAction]
 public void Index()
 {
 MSPetShopDataContext db = new MSPetShopDataContext();
 ProductInfo productinfo = db.ProductInfos.Single(p => p.ProductId 
                  == "BD-03");
 RenderView("Product", productinfo);
 }
 }
 |  第四步:配置路径选择,在Application_Start方法中进行配置: 
               
                | void Application_Start(object sender, EventArgs 
                  e) {
 RouteTable.Routes.Add(
 new Route
 {
 Url = "[controller]/[action].mvc",
 Defaults = new { action = "Index"},
 RouteHandler = typeof(MvcRouteHandler)
 }
 );
 }
 |  建立一个基于ASP.NET MVC Framework的应用程序,基本上就分上面的四步。目前ASP.NET MVC Framework还只是实现了一些基本的功能,在正式版中,其HTML帮助方法将会有几十个之多,让我们拭目以待吧。 
             3. ASP.NET AJAX改进  在ASP.NET 3.5 Extensions中对于ASP.NET AJAX改进最重要的一点就是更好的浏览器历史的支持,是我们可以很方便的进行控制浏览器的前进、后退按钮。它提供了两种方式供我们选择,使用服务器端控件或者使用客户端脚本。下面我将用示例简单演示一下如何使用服务器段控件进行浏览器历史的控制。 
              添加ScriptManager控件,并设置其EnableHistory属性为true,允许浏览器的历史管理,以及OnNavigate处理为OnNavigateHistory函数,以便处理导航时的事件。同时EnableStateHash属性设为了false,主要是为了便于调试,以明文的方式进行状态的查看,如果实际使用的时候可以根据需要决定是否需要对状态进行Hash加密: 
               
                | <asp:ScriptManager runat="server" 
                  ID="ScriptManager1" OnNavigate="OnNavigateHistory"
 EnableHistory="true"
 EnableStateHash="false" />
 |  创建浏览器历史点,在单击按钮时创建,通过AddHistoryPoint方法来添加: 
               
                | public void ButtonClick(object sender, EventArgs 
                  e) {
 LabelHistoryData.Text = ((Button)sender).Text;
 ScriptManager.GetCurrent(this).AddHistoryPoint(key, LabelHistoryData.Text);
 }
 |  进行导航处理: 
               
                | public void OnNavigateHistory(object sender, 
                  HistoryEventArgs e) {
 LabelHistoryData.Text = Server.HtmlEncode(e.State[key]);
 }
 |  同时为了演示,需要在页面上添加三个按钮: 
               
                | <asp:UpdatePanel ID="UpdatePanel1" 
                  runat="server"> <Triggers>
 <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" 
                  />
 <asp:AsyncPostBackTrigger ControlID="Button2" EventName="Click" 
                  />
 <asp:AsyncPostBackTrigger ControlID="Button3" EventName="Click" 
                  />
 </Triggers>
 <ContentTemplate>
 <asp:Panel runat="server" CssClass="box" 
                  ID="Content" Height="40px">
 Date and Time:
 <%= DateTime.Now.ToLongTimeString() %>
 <br />
 Page's refresh state:
 <asp:Label runat="server" ID="LabelHistoryData" 
                  />
 </asp:Panel>
 </ContentTemplate>
 </asp:UpdatePanel>
 <p />
 <asp:Button runat="server" ID="Button1" 
                  Text="Key 1" OnClick="ButtonClick" />
 <asp:Button runat="server" ID="Button2" 
                  Text="Key 2" OnClick="ButtonClick" />
 <asp:Button runat="server" ID="Button3" 
                  Text="Key 3" OnClick="ButtonClick" />
 |  上面的方式主要是采用了服务器端的方式进行ASP.NET AJAX中对于浏览器历史的支持,同样你也可以采用客户端脚本对浏览器历史进行管理,这里不再说明。 4. ASP.NET 动态数据支持   在ASP.NET 3.5 Extensions中包含了一个非常酷的特性,就是ASP.NET Dynamic Data(ASP.NET 
              动态数据),它允许我们不用编写一行代码极其快速地建造使用LINQ to SQL对象模型的数据驱动的网站,使用ASP.NET Dynamic 
              Data可以体验一下.NET平台下ROR的感觉。   在建立完ASP.NET Dynamic Data站点之后,它的项目结构如下所示,其中App_Shared文件夹下包含了DynamicDataPages和DynamicDataFields两个文件夹,DynamicDataPages文件夹下包含了一些aspx页面,用于显示不同类型页面的模板,DynamicDataFields下包含了一些用户控件,用来显示和编辑不同类型的字段时所有的模板。 
 现在我们可以使用LINQ to SQL来建立一个数据模型,加入想要显示的表,剩下唯一要做的就是启用动态模板,在Web.config中dynamicData节点中配置enableTemplates属性为true,它的默认值为false: 
               
                | <dynamicData dataContextType=”” enableTemplates=”true”> <mappings queryStringKeyPrefix="" pattern="~/{table}/{viewName}.aspx">
 <add actions="list,details" viewName="ListDetails" 
                  templateFile="ListDetailsTemplate.aspx"/>
 </mappings>
 </dynamicData>
 |  除此之外,不用写任何一行代码,就可以出现下面的网站效果: 
 怎么样?是不是有些ROR的感觉呢?在页面上列出了我们在数据模型中选择的所有的表,可以点击表名进入具体的页面查看效果。如果自动生成的这些页面不能满足你的需求,ASP.NET 
              Dynamic Data还提供了一些定制的功能,可以通过MasterPage、CSS样式来定制网站的外观,自定义动态数据视图、自定义动态数据字段、创建自己的动态数据字段、自定义数据验证等方法,来定制我们的网站外观。 5. ASP.NET Silverlight支持   ASP.NET Silverlight支持,提供了一些ASP.NET 服务器控件,使得我们可以更加方便的在ASP.NET使用Silverlight,目前提供的控件似乎只有<asp:MediaPlayer/>控件,下面通过几个代码片段简单说明一下。 
              声明<asp:MediaPlayer/>控件,分别指定控件的高度和宽度,并且指定视频文件的URL地址,可以使用MediaSkin属性来指定控件的外观样式: 
             
               
                | <asp:MediaPlayer ID="mediaPlayer" 
                  runat="server" Height="300px"
 Width="450px"
 AutoPlay="false"
 MediaSkin="Expression"
 Windowless="true"
 MediaSource='<%# Eval("MediaUrl") %>">'
 OnClientChapterSelected="onClientChapterSelected"
 OnClientChapterStarted="onClientChapterStarted">
 </asp:MediaPlayer>
 |  如果设置了AutoPlay属性为True,当控件中链接了视频文件时,它将会自定播放,除此之外,我们也可以使用JavaScript脚本来控制视频的播放。设置控件的AutoPlay属性为false,并且在控件的下方添加一个HTML的Button控件: 
               
                | <button id="play" onclick="onPlay()"
 type="button"
 disabled="disabled">
 Play
 </button>
 |  并且在页面中实现onPlay()方法,查找到mediaPlayer控件,调用它的play()方法,并且禁用button控件。 
               
                | <script type="text/javascript"> function onPlay()
 {
 $find('mediaPlayer').play();
 $get('play').disabled = "disabled";
 }
 </script>
 |   关于ASP.NET Silverlight的支持就简单的介绍这么多了。至于ADO.NET数据服务大家可以参考官方的文档。 6. 结束语   本文通过几个简单的示例,向您展示了ASP.NET Extensions中的几个特性。ASP.NET Extensions作为微软明年即将推出的ASP.NET产品,在ASP.NET方面提供了更多更强的新的特性支持,值得我们关注。 ASP.NET Extensions CTP下载地址:http://www.asp.net/ajax/downloads/  |