أنا أستخدم CSLA.NET للعمل في مشروع ويب ووجدت أن نموذج CSLA ليس مناسبًا جدًا للظروف الوطنية للصين عند تطوير الويب.
تعتمد جميع سلسلة قوالبه على النظر في النماذج الرئيسية التفصيلية، مثل "أمر الشراء"، الذي يحتوي على رأس واحد وصفوف تفاصيل، وهو أمر رائع ضمن WinForm.
ولكن في ظل الويب، يتم تحرير معظم الكائنات باستخدام نموذج منفصل، لذلك يبدو الأمر غريبًا بعض الشيء.
إن فهمي ليس عميقًا بعد، وما زلت أتعلم، لقد أفادني الإطار بأكمله كثيرًا، دعنا نصل إلى هذه النقطة.
لاستخدام ترحيل الصفحات Sql2005 بشكل ملائم في نموذج CSLA، نحتاج إلى القيام بأربع خطوات.
الخطوة 1: تطبيق معايير الترحيل لتمرير معلمات الترحيل.
[قابل للتسلسل ()]
الفئة العامة PagingCriteria<T>: CriteriaBase
{
#المنطقة المقدمة
معرف عام ParamDic { احصل على مجموعة خاصة }
سلسلة عامة SortExpression {احصل على مجموعة خاصة؛
سلسلة عامة DefaultOrder {احصل على مجموعة خاصة}
public int StartRowIndex {get;
public int MaxiRows { get;
#endregion
protectedPagingCriteria(){ }
PagingCriteria العامة (IDictionary paramDic، int startRowIndex، intmaxRows، stringsortExpression، string defaultOrder)
: قاعدة (نوع (T))
{
ParamDic = paramDic;
SortExpression =sortExpression;
DefaultOrder = defaultOrder;
StartRowIndex = startRowIndex;
MaxiRows = MaxRows؛
}
}
الخطوة 2: تنفيذ PagingWrapper لتغليف عبارات Sql العادية في عبارات الترحيل.
فئة PagingWrapper العامة الثابتة
{
سلسلة ثابتة خاصة SQLTEMPLATE = @"مع TargetTable AS(اختر ROW_NUMBER() OVER (ترتيب حسب درجة الحرارة.{1}) كرقم الصف، درجة الحرارة.* من ({0}) كدرجة حرارة) حدد * من TargetTable حيث رقم الصف بين {2} و{3};اختر العد(*) من ({0}) درجة الحرارة";
التفاف السلسلة الثابتة العامة (سلسلة sqlQuery، سلسلة SortExpression، int startRowIndex، intmaxRows)
{
إذا (string.IsNullOrEmpty(SortExpression))
رمي استثناء جديد("لم يتم تحديد عمود فرز.");
return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex +maxRows);
}
سلسلة ثابتة عامة التفاف<T>(سلسلة sqlQuery، معايير PagingCriteria<T>)
{
ترتيب السلسلة = (string.IsNullOrEmpty(criteria.SortExpression)) ؟
return Wrap(sqlQuery, order, المعايير.StartRowIndex, المعايير.MaximumRows);
}
}
الجزء 3: تم استدعاء كائن المجموعة هنا قائمة الأدوار.
باستخدام (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
string sql = "SELECT * FROM الأدوار";
cm.CommandText = PagingWrapper.Wrap(sql, المعايير);
باستخدام (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
بينما (د.قراءة ())
Add(Role.FillRole(dr));
dr.NextResult();
قراءة ()؛
TotalRowCount = dr.GetInt32(0);
}
} يتم إرجاع CommandText عن طريق استدعاء Wrapper الخاصية TotalRowCount هي تطبيق واجهة Csla.Core.IReportTotalRowCount.
الخطوة 4: استخدم التحكم في مصدر البيانات على الصفحة، واربط Gridview وقم بتنفيذ الترحيل:
العدد الإجمالي الخاص = 0 ؛
الفراغ المحمي CslaDs_SelectObject(مرسل الكائن، Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList list = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = list;
TotalCount = list.TotalRowCount;
}
gvlist_RowDataBound (مرسل الكائن، GridViewRowEventArgs e) باطلة محمية
{
إذا (e.Row.RowType == DataControlRowType.Pager)
{
((Label)e.Row.FindControl("lblTotal")).Text = TotalCount.ToString();
}
}قائمة الأدوار الثابتة العامة PagingRoleList(IDictionary paramDic، string SortExpression، int startRowIndex، intmaxRows)
{
return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex,maxRows, 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) + "page" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Page" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="الصفحة السابقة" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Page" 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="Server" Text="الصفحة الأخيرة" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Page" CommandArgument="Last"></asp:LinkButton>
<br />
</PagerTemplate> ما يجب توضيحه هنا هو أنه يتم الحصول على العدد الإجمالي للصفوف من خلال الخاصية list.TotalRowCount، لذلك يحتاج RoleList إلى تنفيذ واجهة Csla.Core.IReportTotalRowCount.
قد تتساءل، لماذا لا تكتب العدد الإجمالي للصفوف مباشرة في Gridview وPagerTemplate؟ في الواقع، هذا لأن Gridview لا يعرض هذه الخاصية، كائن System.Web.UI.DataSourceSelectArguments.
بعد الحصول على البيانات، سيتم إرجاع العدد الإجمالي للصفوف إلى داخل Gridview، لكن Gridview سيقوم بإنشاء PagedDataSourse محلي بطريقة خاصة وتسجيل العدد الإجمالي للصفوف فيه ولا يمكن الحصول عليه خارجيًا ولا من خلاله انعكاس.
لذا فإن أبسط طريقة هي كتابتها أولاً، ثم كتابتها في حدث RowDataBound، إذا كنت بحاجة إلى الكمال، فيمكنك تغليف Gridview بنفسك وإضافة خاصية TotalRowCount وكشفها.