ฉันใช้ CSLA.NET เพื่อทำงานในโครงการเว็บ และพบว่าโมเดล CSLA ไม่เหมาะกับเงื่อนไขของประเทศจีนมากนักเมื่อพัฒนาเว็บ
ชุดเทมเพลตของเขาทั้งหมดขึ้นอยู่กับการพิจารณาแบบฟอร์มรายละเอียดหลัก เช่น "ใบสั่งซื้อ" ซึ่งมีส่วนหัวเดียวและแถวรายละเอียด ซึ่งใช้งานได้ดีภายใต้ WinForm
แต่ภายใต้เว็บ วัตถุส่วนใหญ่ได้รับการแก้ไขโดยใช้แบบฟอร์มแยกต่างหาก ดังนั้นจึงรู้สึกอึดอัดเล็กน้อย
ความเข้าใจของฉันยังไม่ลึกซึ้งนัก และฉันยังคงเรียนรู้กรอบการทำงานทั้งหมดที่เป็นประโยชน์กับฉันมาก เรามาเข้าเรื่องกันดีกว่า
หากต้องการใช้เพจจิ้ง Sql2005 ในโมเดล CSLA อย่างสะดวก เราจำเป็นต้องดำเนินการสี่ขั้นตอน
ขั้นตอนที่ 1: ใช้ PagingCriteria เพื่อส่งพารามิเตอร์การเพจ
[สามารถซีเรียลไลซ์ได้()]
PagingCriteria<T> คลาสสาธารณะ : CriteriaBase
-
#ภูมิภาคยื่นแล้ว
ParamDic สาธารณะ { รับ;
สตริงสาธารณะ SortExpression { รับ; ชุดส่วนตัว;
สตริงสาธารณะ DefaultOrder { รับ; ชุดส่วนตัว;
int StartRowIndex สาธารณะ { รับ;
สาธารณะ int MaximumRows { รับ;
#ภูมิภาคสุดท้าย
protectedPagingCriteria(){ }
PagingCriteria สาธารณะ (IDictionary paramDic, int startRowIndex, int maximumRows, สตริง sortExpression, สตริง defaultOrder)
: ฐาน(แบบ(T))
-
ParamDic = พารามิเตอร์ Dic;
SortExpression = sortExpression;
DefaultOrder = ค่าเริ่มต้นออร์เดอร์;
StartRowIndex = startRowIndex;
MaximumRows = แถวสูงสุด;
-
-
ขั้นตอนที่ 2: ใช้ PagingWrapper เพื่อสรุปคำสั่ง Sql ธรรมดาให้เป็นคำสั่งเพจ
PagingWrapper คลาสคงที่สาธารณะ
-
สตริง const ส่วนตัว SQLTEMPLATE = @"ด้วย TargetTable AS(เลือก ROW_NUMBER() OVER (เรียงลำดับตาม Temp.{1}) เป็น RowNumber,Temp.* จาก ({0}) เป็น Temp) เลือก * จาก TargetTable WHERE RowNumber ระหว่าง {2} และ {3};เลือกจำนวน(*) จาก ({0}) อุณหภูมิ";
การตัดสตริงสาธารณะแบบคงที่ (สตริง sqlQuery, สตริง SortExpression, int startRowIndex, int maximumRows)
-
ถ้า (string.IsNullOrEmpty(SortExpression))
โยนข้อยกเว้นใหม่ ("ไม่ได้ระบุคอลัมน์การเรียงลำดับ");
กลับสตริง รูปแบบ (SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows);
-
สตริงคงที่สาธารณะ Wrap<T>(สตริง sqlQuery, เกณฑ์ PagingCriteria<T>)
-
ลำดับสตริง = (string.IsNullOrEmpty(criteria.SortExpression)) ?
return Wrap (sqlQuery, ลำดับ, เกณฑ์.StartRowIndex, เกณฑ์.MaximumRows);
-
-
ส่วนที่ 3: เรียกว่าในวัตถุคอลเลกชัน นี่คือ RoleList
โดยใช้ (SqlCommand cm = cn.CreateCommand())
-
cm.CommandType = CommandType.Text;
string sql = "SELECT * จากบทบาท";
cm.CommandText = PagingWrapper.Wrap(sql, เกณฑ์);
ใช้ (SafeDataReader dr = ใหม่ SafeDataReader(cm.ExecuteReader()))
-
ในขณะที่ (dr.Read())
เพิ่ม(Role.FillRole(dr));
dr.NextResult();
ดร.อ่าน();
TotalRowCount = dr.GetInt32(0);
-
} CommandText ถูกส่งกลับโดยการเรียก Wrapper คุณสมบัติ TotalRowCount คือการใช้งานอินเทอร์เฟซ Csla.Core.IReportTotalRowCount
ขั้นตอนที่ 4: ใช้การควบคุมแหล่งข้อมูลบนเพจ ผูก Gridview และใช้เพจจิ้ง:
ส่วนตัว int TotalCount = 0;
โมฆะที่ได้รับการป้องกัน CslaDs_SelectObject (ผู้ส่งวัตถุ Csla.Web.SelectObjectArgs e)
-
รายการ BLL.Security.RoleList = BLL.Security.RoleList.PagingRoleList (null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = รายการ;
TotalCount = รายการ TotalRowCount;
-
โมฆะที่ได้รับการป้องกัน gvlist_RowDataBound (ผู้ส่งวัตถุ GridViewRowEventArgs e)
-
ถ้า (e.Row.RowType == DataControlRowType.Pager)
-
((ป้ายกำกับ)e.Row.FindControl("lblTotal")).Text = TotalCount.ToString();
-
} Public Static RoleList PagingRoleList (IDictionary paramDic, สตริง SortExpression, int startRowIndex, int maximumRows)
-
ส่งคืน DataPortal.Fetch<RoleList>(PagingCriteria ใหม่<RoleList>(paramDic, startRowIndex, maximumRows, SortExpression, "ID"));
} ส่วนการแบ่งหน้า Gridview ของหน้า:
<เทมเพลตเพจเจอร์>
<br />
รวม <asp:Label ID="lblTotal" runat="server" ></asp:Label> แถว
<asp:Label ID="lblPage" runat="server" Text='<%# "Page" + (((GridView)Container.NamingContainer).PageIndex + 1) + "หน้า/ทั้งหมด" + (((GridView) Container.NamingContainer).PageCount) + "หน้า" %> '></asp:ป้ายกำกับ>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Enabled='< %# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName = "หน้า" CommandArgument = "First" ></asp:LinkButton>
<asp:LinkButton ID = "lbnPrev" runat = "เซิร์ฟเวอร์" Text = "เพจก่อนหน้า" Enabled = '<% # ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName = "หน้า" CommandArgument = "ก่อนหน้า" ></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="หน้าถัดไป" Enabled='< %# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName = "หน้า" CommandArgument = "ถัดไป" ></asp:LinkButton>
<asp:LinkButton ID = "lbnLast" runat = "เซิร์ฟเวอร์" Text = "หน้าสุดท้าย" Enabled = '<% # ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName = "หน้า" CommandArgument = "สุดท้าย" ></asp:LinkButton>
<br />
</PagerTemplate> สิ่งที่ควรอธิบายที่นี่คือจำนวนแถวทั้งหมดที่ได้รับผ่านคุณสมบัติ list.TotalRowCount ดังนั้น RoleList จำเป็นต้องใช้อินเทอร์เฟซ Csla.Core.IReportTotalRowCount
คุณอาจถามว่าทำไมไม่เขียนจำนวนแถวทั้งหมดโดยตรงใน Gridview และ PagerTemplate ที่จริงแล้วเป็นเพราะ Gridview ไม่เปิดเผยคุณสมบัตินี้ System.Web.UI.DataSourceSelectArguments
หลังจากได้รับข้อมูลแล้ว จำนวนแถวทั้งหมดจะถูกส่งกลับไปยังด้านในของ Gridview แต่ Gridview จะสร้าง PagedDataSourse ในเครื่องด้วยวิธีการส่วนตัว และบันทึกจำนวนแถวทั้งหมดในนั้น โดยไม่สามารถรับจากภายนอกหรือผ่านได้ การสะท้อนกลับ
ดังนั้นวิธีที่ง่ายที่สุดคือจดไว้ก่อน แล้วจึงเขียนลงในเหตุการณ์ RowDataBound หากคุณต้องการความสมบูรณ์แบบ คุณสามารถสรุป Gridview ด้วยตัวเองและเพิ่มคุณสมบัติ TotalRowCount แล้วแสดงออกมา