与ObjectDataSource共舞

4,ORM组件XCode(与ObjectDataSource共舞) html

 

XCode为了能更方便的解决大部分问题,不得不“屈身”于ObjectDataSource。 数据库

先上一个经典例子(ObjectDataSource+GridView)(ObjectDataSource): 框架

 

< asp:GridView  ID ="GridView1"  runat ="server"  AllowPaging ="True"  AllowSorting ="True"
    AutoGenerateColumns
="False"  DataKeyNames ="ID"  DataSourceID ="ObjectDataSource1"
    EnableModelValidation
="True" >
    
< Columns >
        
< asp:BoundField  DataField ="ID"  HeaderText ="ID"  InsertVisible ="False"  ReadOnly ="True"
            SortExpression
="ID"   />
        
< asp:BoundField  DataField ="Name"  HeaderText ="Name"  SortExpression ="Name"   />
        
< asp:BoundField  DataField ="ParentID"  HeaderText ="ParentID"  SortExpression ="ParentID"   />
        
< asp:BoundField  DataField ="test"  HeaderText ="test"  SortExpression ="test"   />
        
< asp:BoundField  DataField ="Description"  HeaderText ="Description"  SortExpression ="Description"   />
    
Columns>
asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="PurpleSun.Center.Area"
    DeleteMethod
="Delete" EnablePaging="True" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}"
    SelectCountMethod
="FindCountByName" SelectMethod="FindAllByName" SortParameterName="orderClause"
    TypeName
="PurpleSun.Center.Area" UpdateMethod="Save">
    
<SelectParameters>
        
<asp:Parameter Name="name" Type="String" />
        
<asp:Parameter Name="value" Type="Object" />
        
<asp:Parameter Name="orderClause" Type="String" />
        
<asp:Parameter Name="startRowIndex" Type="Int32" />
        
<asp:Parameter Name="maximumRows" Type="Int32" />
    
SelectParameters>
asp:ObjectDataSource>

 

 

下面用截图演示整个过程: 测试

拖GridView和ObjectDataSource 网站

wps_clip_image-15245

选中ObjectDataSource,注意右上角的智能标记 spa

wps_clip_image-23943

配置数据源 code

wps_clip_image-16852

这里只列出数据组件,为何这里只有咱们的Area类?为何?咱们看看实体类 orm

wps_clip_image-12458

就是DataObject特性起的做用,应该说,全部加了该特性的类,都会被看成数据组件在ObjectDataSource配置里面出现。固然,不加DataObject特性也是能够的,可是在ObjectDataSource配置的时候,就不能勾选数据组件了,那样会列出全部类(是的,全部类)。 server

选择Area类,继续 htm

wps_clip_image-24997

继续猜想,这里能列出这些方法,应该也是有特性的,那就是DataObjectMethod特性啦。

wps_clip_image-9268

第一个参数表明方法类型(查询、插入、更新、删除),第二个参数表示是否默认方法,默认方法会在配置ObjectDataSource时被默认选中。

固然啦,另外三个配置页也是有的(这里以Update为例)

wps_clip_image-12855

wps_clip_image-24612

最后一步定义参数,在这里就不定义了

wps_clip_image-16010

能够看到,左边已经列出了前面选择的Select方法的全部参数。

来看看一个神奇的地方

wps_clip_image-21754wps_clip_image-27958

ObjectDataSource能够把查询参数绑定到Cookie、控件、Request.Form、Request.QueryString、Session等。咱们通常绑定到控件,作查询的时候很是有用。每个查询项做为一个参数,而后在这里绑定到对应的控件;也常常绑定到QueryString,好比表单页面编辑数据的时候,这里绑定主键,而后就能把相应的对象找出来。

这里神奇的地方就在于绑定。须要作复杂查询的时候,能够在界面上放置查询控件

wps_clip_image-140

而后编写一个对应的查询方法,固然要加上DataObjectMethod特性了,而后在ObjectDataSource配置的时候把参数和控件绑定起来

wps_clip_image-9814

(关于这类高级查询后面专门介绍,这里仅仅是为了说明绑定的神奇)

绑定的神奇就在于,界面控件问数据源控件(如ObjectDataSource)要数据的时候,数据源控件开始着手准备参数,反射读取绑定控件的值做为参数,并转为相应的类型,而后再反射调用实体类的查询方法(如Search)。

到这里,ObjectDataSource的基本配置已经完成,绝大多数ORM框架对ObjectDataSource的支持,也仅仅是到这里而已。而XCode的模型,是彻底知足ObjectDataSource要求的,下面继续高级功能

wps_clip_image-31176

这是ObjectDataSource控件属性中的分页类属性,第一项启用分页,第三项指定用于查询全部记录数的方法(前面提到过查询方法是成对出现的,这里的FindAllByName和FindCountByName就是一对),至于第二项和第四项,是否是很熟悉?

wps_clip_image-17527

wps_clip_image-6921

这两个方法,一个返回实体集合,一个返回总行数,而参数则是一摸同样。这就是ObjectDataSource对分页查询的要求,若是没有第二个,ObjectDataSource也能提供查询数据功能,可是就没办法分页了。

回过头了,仔细看看最后两个参数的名称,是否是跟ObjectDataSource属性中的那两个一摸同样?因此,XCode使用这两个名字做为参数名,正是这个缘由。若是查询方法使用的不是这两个参数,那么在配置ObjectDataSource的时候本身跟着改就是了。

这两个参数,第一个是从哪一行开始读数据,第二个是返回的最大行数,其实就是每页行数。这种分页结构,跟别的绝大部分分页控件什么的都不相同。因此,并非XCode的分页另类,而是别的分页才是另类,XCode是正统(哈哈)。

除了分页属性,再看看一个排序属性

wps_clip_image-8804

正是查询方法的倒数第三个参数。GridView在排序的时候,会给这个参数传递ID Asc或Name Desc等。而查询方法内部,正是根据这个参数,以及两个分页参数,拼接SQL语句进行查询的。

至此,ObjectDataSource配置完成。打开GridView的智能标记,选择ObjectDataSource控件做为数据源,GridView便可自动生成列

wps_clip_image-7754

固然,这个列并非数据库字段,而是实体类的属性。

在智能标记面板上能够看到,启用分页和启用排序能够勾选了,正是由于刚才在ObjectDataSource中配置好了。都勾上!

运行,看效果

wps_clip_image-6948

界面很丑,不过那是美工的事情了。试试分页(打开OrmDebug开关,查看SQL语句)

wps_clip_image-8101

执行的SQL:

Select * From (Select row_number() over(Order By ID Desc) as row_number, * From Area) XCode_Temp_b Where row_Number Between 71 And 80

这是XCode生成的分页语句,由于如今测试环境是SQL2008,随意生成了row_number的分页,若是是别的数据库,就会不一样了。但那是XCode的事情,开发者不须要关心。

再试试在分页的基础上排序(点击Name):

wps_clip_image-31464

    执行的SQL:

Select * From (Select row_number() over(Order By Name) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

    排序已经改成Order By Name了,再点一次Name,执行SQL:

Select * From (Select row_number() over(Order By Name DESC) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

    彻底知足要求!

 

    BTW:GridView那里,其实还能够启用编辑和删除的,由于配置ObjectDataSource的时候,默认已经配置了编辑和删除的方法。

 

    最后,目的已经达到,或许你尚未发现,到这里咱们尚未手工编写任何代码呢!

 

    XCode与ObjectDataSource共舞能够获得很是美的开发效果,可是,上面的模式,已是三年前的作法了,咱们如今有了更好的工业级的作法——批量生产

 

大石头

新生命开发团队

2010-08-24 13:25

做者: 大石头 发表于 2010-09-13 01:39 原文连接

评论: 6 查看评论 发表评论

最新新闻:
· 是否该让开发人员跟客户直接交流?(2010-12-21 07:53)
· 亚马逊副总裁跳槽Groupon任CFO(2010-12-21 07:50)
· Gmail语音服务将延长至2011年末(2010-12-21 07:49)
· AOL收购我的档案网站About.me(2010-12-21 07:48)
· AT&T 19.25亿美圆购入高通 700MHz 低频频谱(2010-12-21 07:42)

编辑推荐:Mono又更新了

网站导航:博客园首页  个人园子  新闻  闪存  小组  博问  知识库

相关文章
相关标签/搜索