asp.net2.0里面的objectdatasource可以使數(shù)據(jù)顯示控件gridview等進(jìn)行綁定顯示,編輯。還可以支持內(nèi)置的分頁,排序等。使用了orm之后,一樣可以使用objectdatasource。
這里的分頁不再是從數(shù)據(jù)庫取出所有,然后選擇性綁定,而是直接在數(shù)據(jù)庫取出第幾頁,然后綁定。這個差別還是十分巨大的,效率大大提高。
編輯,創(chuàng)建,排序也都是,直接由objectdatasource提供,不需要再gridview中寫什么代碼。
這樣,可以把object設(shè)計的包含有不少邏輯,至少是對數(shù)據(jù)庫操作的,而ui就顯得比較簡單,剝離的再開一點,對以后移植到win上,或者做成smartclient都比較有益。
這里有一片blog,講的比較好http://www.evosoftworks.com/articles/wormods.aspx。
我用的正好也是wilsonorm,所以照此也作了一個。
基本的結(jié)構(gòu)是這樣的:
ui(gridview等控件--objectdatasource控件)----〉objectdatasource類(object,寫crud分頁等邏輯)---〉(orm實現(xiàn)crud)---〉db
主要有幾步
1:給object增加屬性和方法,來完成crud,分頁等邏輯
2:配置gridview等ui控件連接到objectdatasource控件。
先看第一個
1:給object增加屬性和方法,來完成crud,分頁等邏輯。該object類由工具根據(jù)db結(jié)構(gòu)生成,同時生成的還有mapping文件。
首先,給該object增加一個標(biāo)示屬性dataobject(),在system.componentmodel命名空間里面 [dataobject()]
public class productdescription
{ 第二,給這個object類增加crud的方法。
先看一個insert方法
[dataobjectmethod(dataobjectmethodtype.insert)]
public static void insert(productdescription productdescription)
{
try
{
manager.datamanager.starttracking(productdescription, initialstate.inserted);
manager.datamanager.persistchanges(productdescription);
}
catch (exception ex)
{
log.error(ex);
}
} 這個方法前面需要加一個[dataobjectmethod(dataobjectmethodtype.insert)]屬性,表示這是insert方法;
這個方法是靜態(tài)公開的方法;
參數(shù),就是這個object本身的一個實例。這樣比較好,因為在邏輯好很好理解,都是在對object進(jìn)行操作。
剩下的,delete,update方法也是這樣寫。
然后看看select方法,比較特殊。
select方法
1 [dataobjectmethod(dataobjectmethodtype.select)]
2 public collection<productdescription> retrieve(string query, int maxrows, int startrowindex, string sortclause)
3 {
4 try
5 {
6 int numpages = 0;
7 if (sortclause == null || sortclause == "")
8 sortclause = "modifieddate desc";
9 collection<productdescription> cs;
10 cs = retrievepage(query, sortclause, maxrows, (int)math.ceiling((double)startrowindex / maxrows) + 1, out numpages);
11 _numrecs = ((iobjectpage)cs).totalcount;
12 return cs;
13 }
14 catch (exception ex)
15 {
16 log.error(ex);
17 return null;
18 }
19 }
20 [dataobjectmethod(dataobjectmethodtype.select)]
21 static public objectset retrieve(string key, string value)
22 {
23 if (value == null || value == "")
24 return null;
25 try
26 {
27 queryhelper helper = manager.datamanager.queryhelper;
28 key = helper.getfieldname(typeof(productdescription).tostring() + "." + key);
29 objectquery query = new objectquery(typeof(productdescription), string.format("{0}='{1}'", key, value), "");
30 objectset obj = manager.datamanager.getobjectset(query);
31 return obj;
32 }
33 catch (exception ex)
34 {
35 log.error(ex);
36 return null;
37 }
38 }
39
40 public int reccount(string query, int maxrows, int startrowindex, string sortclause)
41 {
42 return _numrecs;
43 }
44
45 public static collection<productdescription> retrievepage(string whereclause, string sortclause, int pagesize, int pageindex, out int pagecount)
46 {
47 objectquery<productdescription> query = new objectquery<productdescription>(whereclause, sortclause, pagesize, pageindex);
48 objectset<productdescription> pageset = manager.datamanager.getobjectset<productdescription>(query);
49 pagecount = pageset.pagecount;
50 return pageset;
51 } 第一個方法public collection<productdescription> retrieve(string query, int maxrows, int startrowindex, string sortclause),這是可以實現(xiàn)內(nèi)置分頁,和排序的方法。需要注意的是這句代碼_numrecs = ((iobjectpage)cs).totalcount; 在這里,分頁之后,立即取出總頁數(shù),這個是用來供顯示頁號的;于此對應(yīng),方法 public int reccount(string query, int maxrows, int startrowindex, string sortclause)就是用來取出記錄條數(shù)的;注意,這兩個方法一定要對應(yīng),參數(shù)也一樣。
第二個方法 static public objectset retrieve(string key, string value)只是普通的取出一條紀(jì)錄。可以用在detailview/formview的顯示。
代碼看上去雖然很多,但是其實很模式化,所以可以使用codesmith或者直接修改一下ormhelper工具來動態(tài)生成,不需要手工寫代碼。
有了這四個方法,crud,分頁,排序就已經(jīng)完成了。這樣的object,和ui無關(guān),只是數(shù)據(jù)邏輯。
2:ui的配置。ui配置也分兩層:gridview等顯示控件;objectdatasource控件
現(xiàn)在給gridview等控件配置object數(shù)據(jù)源,直接連接到object上,實現(xiàn)顯示編輯等功能。其實就是設(shè)置一個連接到objectdatasource的屬性。
<asp:gridview id="gv_data" runat="server" allowpaging="true" allowsorting="true" datasourceid="ods_list"
這是objectdatasource控件的配置
objectdatasource
1<asp:objectdatasource id="ods_list" runat="server" dataobjecttypename="businessmodel.productdescription"
2 deletemethod="delete" oldvaluesparameterformatstring="original_{0}" selectmethod="retrieve"
3 typename="businessmodel.productdescription" updatemethod="update" sortparametername="sortclause"
4 maximumrowsparametername="maxrows" selectcountmethod="reccount" enablepaging="true"
5 conflictdetection="overwritechanges" convertnulltodbnull="false">
6 <selectparameters>
7 <asp:parameter name="query" type="string" />
8 <asp:parameter name="maxrows" type="int32" />
9 <asp:parameter name="startrowindex" type="int32" />
10 <asp:parameter name="sortclause" type="string" />
11 </selectparameters>
12</asp:objectdatasource>
看看里面的屬性,就是配置crud方法的參數(shù),和對應(yīng)的方法名。這些正是我們在類中實現(xiàn)的。比方說這里配置delete方法:deletemethod="delete";而這里就是剛才說的記錄個數(shù)的屬性:selectcountmethod="reccount";還有排序等等。
這里的參數(shù)怎么傳遞?系統(tǒng)相關(guān)的屬性由系統(tǒng)傳遞,比方說,maxrows,startrowindex什么的;也可以用代碼來傳遞: this.ods_list.selectparameters["query"].defaultvalue = query;
新聞熱點
疑難解答
圖片精選