ObjectDataSource ใน asp.net2.0 สามารถเปิดใช้งานการควบคุมการแสดงข้อมูล เช่น GridView เพื่อเชื่อมโยงกับการแสดงผลและการแก้ไข นอกจากนี้ยังรองรับเพจ การเรียงลำดับ ฯลฯ ในตัว หลังจากใช้ ORM คุณยังสามารถใช้ ObjectDataSource ได้อีกด้วย
การเพจที่นี่จะไม่ดึงเพจทั้งหมดออกจากฐานข้อมูลอีกต่อไป จากนั้นเลือกการเชื่อมโยงเพจเหล่านั้น แต่จะดึงเพจในฐานข้อมูลออกมาโดยตรงแล้วจึงผูกเพจเหล่านั้น ความแตกต่างยังคงมีอยู่มาก และประสิทธิภาพก็ได้รับการปรับปรุงอย่างมาก
ObjectDataSource เป็นผู้จัดเตรียมการแก้ไข การสร้าง และการจัดเรียงโดยตรง และไม่จำเป็นต้องเขียนโค้ดใดๆ ใน GridView
ด้วยวิธีนี้ การออกแบบ Object อาจมีตรรกะมากมาย อย่างน้อยก็สำหรับการทำงานของฐานข้อมูล และ UI จะดูค่อนข้างเรียบง่าย หากคุณลอกมันออกและเปิดมันขึ้นมาเล็กน้อย จะมีประโยชน์มากกว่าในการปลูกถ่ายเพื่อให้ชนะ ในอนาคตหรือทำให้เป็น SmartClient
นี่คือบล็อกที่พูดคุยได้ดีกว่า http://www.evosoftworks.com/Articles/wormods.aspx
ฉันบังเอิญใช้ WilsonORM ดังนั้นฉันจึงสร้างมันขึ้นมาตามนั้น
โครงสร้างพื้นฐานเป็นดังนี้:
UI (GridView และการควบคุมอื่นๆ--การควบคุม ObjectDataSource)----〉คลาส ObjectDataSource (Object, เขียนเพจ CRUD และตรรกะอื่นๆ)---〉(ORM ใช้ CRUD)---〉DB
มีหลายขั้นตอนหลัก
1: เพิ่มคุณสมบัติและวิธีการให้กับ Object เพื่อทำให้ CRUD, การเพจและตรรกะอื่น ๆ สมบูรณ์
2: กำหนดค่าการควบคุม UI เช่น GridView เพื่อเชื่อมต่อกับการควบคุม ObjectDataSource
มาดูอันแรกกันก่อน
1: เพิ่มคุณสมบัติและวิธีการให้กับ Object เพื่อทำให้ CRUD, การเพจและตรรกะอื่น ๆ สมบูรณ์ คลาส Object ถูกสร้างขึ้นโดยเครื่องมือตามโครงสร้าง DB และไฟล์ Mapping ก็ถูกสร้างขึ้นเช่นกัน
ขั้นแรก ให้เพิ่มแอตทริบิวต์การระบุ DataObject() ให้กับ Object ในเนมสเปซ System.ComponentModel [DataObject()]
ProductDescription คลาสสาธารณะ
{ประการที่สอง เพิ่มวิธี CRUD ให้กับคลาสอ็อบเจ็กต์นี้
มาดูวิธีการแทรกกันก่อน
[DataObjectMethod(DataObjectMethodType.Insert)]
โมฆะคงที่สาธารณะแทรก(รายละเอียดสินค้า productDescription)
-
พยายาม
-
Manager.DataManager.StartTracking (คำอธิบายผลิตภัณฑ์, InitialState.Inserted);
Manager.DataManager.PersistChanges (คำอธิบายผลิตภัณฑ์);
-
catch (ข้อยกเว้น เช่น)
-
เข้าสู่ระบบข้อผิดพลาด (เช่น);
-
} วิธีการนี้จะต้องนำหน้าด้วยแอตทริบิวต์ [DataObjectMethod(DataObjectMethodType.Insert)] ซึ่งระบุว่านี่คือวิธีการแทรก
วิธีนี้เป็นวิธีการสาธารณะแบบคงที่
พารามิเตอร์เป็นตัวอย่างของวัตถุนั้นเอง ซึ่งจะดีกว่า เนื่องจากตรรกะนั้นเข้าใจง่ายและดำเนินการทั้งหมดบน Object
วิธีการลบและอัปเดตที่เหลือก็เขียนในลักษณะนี้เช่นกัน
จากนั้นมาดูวิธีการ Select ที่ค่อนข้างพิเศษ
เลือกวิธีการ
1 [DataObjectMethod(DataObjectMethodType.Select)]
2 คอลเลกชันสาธารณะ <ProductDescription> ดึงข้อมูล (แบบสอบถามสตริง, int maxRows, int startRowIndex, สตริง sortClause)
3 {
4 ลอง
5 {
6 int numPages = 0;
7 ถ้า (sortClause == null || sortClause == "")
8 sortClause = "วันที่แก้ไข";
9 คอลเลกชัน<คำอธิบายผลิตภัณฑ์> cs;
10 cs = RestoreePage(query, sortClause, maxRows, (int)Math.Ceiling((double)startRowIndex / maxRows) + 1, ออก numPages);
11 _numRecs = ((IObjectPage)cs).จำนวนรวม;
12 กลับ cs;
13}
14 จับ (ข้อยกเว้นเช่น)
15 {
16 บันทึกข้อผิดพลาด (เช่น);
17 กลับเป็นโมฆะ;
18}
19}
20 [DataObjectMethod(DataObjectMethodType.Select)]
21 การดึง ObjectSet สาธารณะแบบคงที่ (คีย์สตริง, ค่าสตริง)
ยี่สิบสอง {
23 ถ้า (ค่า == null || ค่า == "")
24 กลับเป็นโมฆะ;
25 ลอง
26 {
27 ตัวช่วย QueryHelper = Manager.DataManager.QueryHelper;
28 คีย์ = helper.GetFieldName(typeof(ProductDescription).ToString() + "." + คีย์);
29 ObjectQuery query = new ObjectQuery(typeof(ProductDescription), String.Format("{0}='{1}'", คีย์, ค่า), "");
30 ObjectSet obj = Manager.DataManager.GetObjectSet(แบบสอบถาม);
31 กลับ obj;
32}
33 catch (ข้อยกเว้นเช่น)
34 {
35 log.Error(เช่น);
36 กลับเป็นโมฆะ;
37 }
38 }
39
40 สาธารณะ int RecCount (แบบสอบถามสตริง, int maxRows, int startRowIndex, สตริง sortClause)
41 {
42 กลับ _numRecs;
43}
44
45 คอลเลกชันสาธารณะแบบคงที่ <ProductDescription> RetrievePage (สตริง WhereClause, สตริง 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>(แบบสอบถาม);
49 pageCount = pageSet.PageCount;
50 กลับชุดหน้า;
51 } วิธีแรกคือ public Collection<ProductDescription> Retrieve(string query, int maxRows, int startRowIndex, string sortClause) ซึ่งเป็นวิธีการที่ใช้เพจและการเรียงลำดับในตัวได้ ควรสังเกตว่ารหัสนี้ _numRecs = ((IObjectPage)cs).TotalCount; ที่นี่ หลังจากการเพจ จำนวนหน้าทั้งหมดจะถูกนำออกทันที ซึ่งใช้เพื่อแสดงหมายเลขหน้าตามลำดับ แบบสอบถามสตริง, int maxRows, int startRowIndex, string sortClause) ใช้เพื่อดึงข้อมูลจำนวนระเบียน โปรดทราบว่าทั้งสองวิธีนี้ต้องสอดคล้องกัน และพารามิเตอร์จะเหมือนกัน
วิธีที่สอง การเรียก ObjectSet สาธารณะแบบคงที่ (คีย์สตริง, ค่าสตริง) เพียงดึงข้อมูลบันทึก สามารถใช้ในการแสดง DetailView/FormView
แม้ว่าโค้ดจะดูเยอะมาก แต่จริงๆ แล้วมันมีรูปแบบที่ดีมาก ดังนั้นคุณสามารถใช้ CodeSmith หรือแก้ไขเครื่องมือ ORMHelper โดยตรงเพื่อสร้างโค้ดแบบไดนามิกโดยไม่ต้องเขียนโค้ดด้วยตนเอง
ด้วยวิธีการทั้งสี่นี้ CRUD เพจ และการเรียงลำดับจะเสร็จสมบูรณ์ วัตถุดังกล่าวไม่เกี่ยวข้องกับ UI แต่มีเพียงตรรกะข้อมูลเท่านั้น
2: การกำหนดค่า UI การกำหนดค่า UI ยังแบ่งออกเป็นสองชั้น: GridView และตัวควบคุมการแสดงผลอื่น ๆ ; การควบคุม ObjectDataSource
ตอนนี้กำหนดค่าแหล่งข้อมูล Object สำหรับการควบคุม เช่น GridView และเชื่อมต่อโดยตรงกับ Object เพื่อใช้ฟังก์ชันต่างๆ เช่น การแสดงผลและการแก้ไข จริงๆ แล้วมันคือการตั้งค่าคุณสมบัติที่เชื่อมต่อกับ ObjectDataSource
<asp:GridView ID = "gv_data" runat = "เซิร์ฟเวอร์" AllowPaging = "True" AllowSorting = "True" DataSourceID = "ods_list"
นี่คือการกำหนดค่าของตัวควบคุม ObjectDataSource
วัตถุ DataSource
1<asp:ObjectDataSource ID = "ods_list" runat = "เซิร์ฟเวอร์" DataObjectTypeName = "BusinessModel.ProductDescription"
2 DeleteMethod = "ลบ" OldValuesParameterFormatString = "Original_{0}" SelectMethod = "ดึงข้อมูล"
3 TypeName = "BusinessModel.ProductDescription" UpdateMethod = "อัปเดต" SortParameterName = "sortClause"
4 MaximumRowsParameterName = "maxRows" SelectCountMethod = "RecCount" EnablePaging = "true"
5 ConflictDetection = "เขียนทับการเปลี่ยนแปลง" ConvertNullToDBNull = "false">
6 <เลือกพารามิเตอร์>
7 <asp:Parameter Name="query" Type="String" />
8 <asp:ชื่อพารามิเตอร์="maxRows" Type="Int32" />
9 <asp:Parameter Name="startRowIndex" Type="Int32" />
10 <asp:Parameter Name="sortClause" Type="String" />
11 </เลือกพารามิเตอร์>
12</asp:ObjectDataSource>
ดูคุณสมบัติภายในซึ่งเป็นพารามิเตอร์สำหรับการกำหนดค่าวิธี CRUD และชื่อวิธีการที่เกี่ยวข้อง นี่คือสิ่งที่เราใช้ในชั้นเรียน ตัวอย่างเช่น มีการกำหนดค่าวิธีการ Delete ที่นี่: DeleteMethod="Delete"; และนี่คือแอตทริบิวต์ของจำนวนระเบียนที่เพิ่งกล่าวถึง: SelectCountMethod="RecCount";
จะส่งพารามิเตอร์ที่นี่ได้อย่างไร? แอ็ตทริบิวต์ที่เกี่ยวข้องกับระบบจะถูกส่งผ่านโดยระบบ เช่น maxRows, startRowIndex ฯลฯ ซึ่งสามารถส่งผ่านด้วยโค้ด: this.ods_list.SelectParameters["query"].DefaultValue = query