分享

体验Jasper (转 思归呓语 )

 快乐学习 2007-05-13

 

在3月份的MVP峰会上,ASP.NET开发团队给我们示范了Jasper(好像那时还不是这名称),因为NDA的原因,我们无法透露细节。如今Jasper公开推出了,让我们来体验一下Jasper。

1. 安装所需软件和建立数据库

1) Visual Studio Orcas Beta 1。下载细节可见:

http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx

2) SQL Server 2005 (Express)版本 Edition。SQL Server 2005 Express版可下载于

http://www.microsoft.com/downloads/details.aspx?familyid=220549b5-0b07-4448-8848-dcc397514b41&displaylang=en

3) Iron Python 1.1 (你也可以VB.NET 9)。 下载地址:

http://www./IronPython/Release/ProjectReleases.aspx?ReleaseId=2573

4) Jasper CTP。下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyId=471BB3AC-B31A-49CD-A567-F2E286715C8F&displaylang=en

5) 运行 C:\Program Files\Microsoft Codename Jasper CTP\Samples\Create and Populate Northwind.cmd 来创建一个小的Northwind数据库。

2.Jasper API由三个主要部分组成:

  1. DynamicContext是使用Jasper的起点。应用程序调用该类的静态方法CreateDynamicContext()创建一个动态的上下文对象,该对象封装了与数据库交互所需的连接和状态信息。该对象对从查询返回的数据对象进行变化跟踪(change tracking)和身份确定(identity resolution),可以用来把所作的数据对象的变化保存到数据库去。
  2. Query类支持建立和发出查询命令,命令可以用Entity SQL查询语言或LINQ。
  3. 代表数据实体的数据类,支持读取和改变属性值,以及自定义的业务逻辑。数据类是运行时动态生成的,其名称和结构与数据库的数据定义或指定的实体数据模型相符。 Jasper数据类生成器使用约定来建立数据类的名称和它们的属性。对数据库里的每个表,或实体数据模型中的每个实体集合,Jasper会生成一个类。Jasper有个命名组件,可以把名称为复数的表名转换成单数的类名,譬如,对应Products表,Jasper会生成Product类。对应数据表的每个字段,Jasper会在类中生成一个对应的属性。Jasper会根据数据表的外键-主键关系建立引用属性。DynamicContext.CreateDynamicContext()返回的上下文对象对应每个表还含有一个类型是Query的属性,譬如,Categories属性和Products属性等。该上下文对象对数据库中的每个存储过程还会生成相应的方法。你可以在代码中使用这些动态生成的数据类,即使这些类在你编写代码时还不存在。在运行时,延迟绑定机制会确定你对这些数据类的引用。

3. 看一下其中的BuildingUI_Web例子

GridViewPage.aspx,其显示是这样的:

.aspx内容为:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="GridViewPage.aspx.vb"

Inherits="GridViewPage" %>

<%@ Register Assembly="Microsoft.Jasper.CTP" Namespace="Microsoft.Jasper.Web"

TagPrefix="jasper" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www./1999/xhtml">
<head runat="server">
<title>Demonstrate Building Web UI with Project Jasper using a GridView

control</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="BackToMainButton" runat="server" Text="Back To Main"
PostBackUrl="Default.aspx" />
</div>
<asp:GridView ID="Products" runat="server"

AutoGenerateDeleteButton="True"
AutoGenerateEditButton="True" AllowPaging="True">
</asp:GridView>
<jasper:AutoDataSource ID="AutoDataSource1" runat="server">
</jasper:AutoDataSource>
</form>
</body>
</html>

后台文件GridViewPage.aspx.vb,是这样的(注释被去除了):

Imports Microsoft.Jasper

Partial Class GridViewPage
           Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          AutoDataSource1.DynamicContext = GetDynamicContext()
End Sub

Private Function GetDynamicContext() As DynamicContext
          Dim context As DynamicContext = Session("DynamicContext")
          If context Is Nothing Then
                  Dim connectionString As String = ConfigurationManager.ConnectionStrings("Northwind").ConnectionString
                  context = DynamicContext.CreateDynamicContext(connectionString)
                  Session("DynamicContext") = context
          End If
         Return context
End Function
End Class

注意,在后台.vb中只需要设置前台数据源控件AutoDataSource的DynamicContext属性。

Jasper在看到前台的
<asp:GridView ID="Products" runat="server" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AllowPaging="True">
</asp:GridView>

根据设置的ID="Products",Jasper会将AutoDataSource1.DynamicContext中的Products查询属性绑定到GridView上。注意上面的第一行记录,Chai2,是在我点击“Edit”按钮编辑更新后的结果。

再看另一个主从关系的例子,MasterDetailsPage.aspx,

后台MasterDetailsPage.aspx.vb内容跟GridViewPage.aspx.vb是一样的,MasterDetailsPage.aspx 的内容是这样的(除去了前面的一些类似的声明内容):

<form id="form1" runat="server">
<asp:ListBox ID="CategoryName" runat="server" AutoPostBack="True"
Height="223px" Width="175px"></asp:ListBox>
<asp:GridView ID="Categories_Products" runat="server">
</asp:GridView>
<Jasper:AutoDataSource ID="AutoDataSource1" runat="server">
</Jasper:AutoDataSource>
</form>

在这里,Jasper会看到<asp:ListBox>的ID与动态生成的Category类里的CategoryName属性一样,该控件就会绑定到对应的数据表上,同时显示指定的属性值。

如果控件名是<Name>_<NavigationPropertyName>的形式,Jasper 就会将其绑定到<Name>数据表对应的类的引用属性<NavigationPropertyName>之上。同时,AutoDataSource控件会去寻找绑定到<Name>的另一个控件,用它作为这个关系导航的数据源。

默认的绑定机制也可以通过覆盖AutoDataSource上的各个AutoBind()方法来实现。AutoBind()方法可以把任意查询对象绑定到可数据绑定的控件上。可数据绑定的控件既可明确指定,也可以让AutoDataSource控件自动根据查询的返回类型来确定合适的控件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多