저는 CSLA.NET을 사용하여 웹 프로젝트를 진행하고 있는데 웹을 개발할 때 CSLA 모델이 중국의 국내 상황에 별로 적합하지 않다는 것을 알게 되었습니다.
그의 템플릿 시리즈는 모두 단일 헤더와 세부 정보 행이 있는 "구매 주문"과 같은 마스터-세부 양식 고려 사항을 기반으로 하며 이는 WinForm에서 매우 유용합니다.
하지만 웹에서는 대부분의 객체를 별도의 형태로 편집하기 때문에 다소 어색한 느낌이 듭니다.
내 이해는 아직 깊지 않으며, 전체 프레임워크가 나에게 많은 도움이 되었습니다. 요점을 살펴보겠습니다.
CSLA 모델에서 Sql2005 페이징을 편리하게 사용하려면 네 단계를 수행해야 합니다.
1단계: 페이징 매개변수를 전달하는 PagingCriteria를 구현합니다.
[직렬화 가능()]
공개 클래스 PagingCriteria<T> : CriteriaBase
{
#지역 신청됨
공개 IDictionary ParamDic { 비공개 세트 }
공개 문자열 SortExpression { 비공개 세트 }
공개 문자열 DefaultOrder { 비공개 세트 }
공개 int StartRowIndex { 비공개 세트 }
공개 int MaximumRows { 비공개 세트 }
#endregion
protectedPagingCriteria(){ }
공개 PagingCriteria(IDictionary paramDic, int startRowIndex, int maximumRows, 문자열 sortExpression, 문자열 defaultOrder)
: 기본(유형(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
기본주문 = 기본주문;
StartRowIndex = startRowIndex;
최대 행 = 최대 행;
}
}
2단계: PagingWrapper를 구현하여 일반 SQL 문을 페이징 문으로 캡슐화합니다.
공개 정적 클래스 PagingWrapper
{
private const string SQLTEMPLATE = @"TargetTable AS(TargetTable AS(ROW_NUMBER() OVER (Tem.{1}순)을 RowNumber,Temp.*로 선택) ({0})에서 Temp로 선택) select * from TargetTable WHERE RowNumber between {2} 및 {3};({0}) 온도에서 개수(*) 선택";
공개 정적 문자열 Wrap(문자열 sqlQuery, 문자열 SortExpression, int startRowIndex, int maximumRows)
{
if (string.IsNullOrEmpty(SortExpression))
throw new Exception("정렬 열이 지정되지 않았습니다.");
return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows);
}
공개 정적 문자열 Wrap<T>(문자열 sqlQuery, PagingCriteria<T> 기준)
{
문자열 순서 = (string.IsNullOrEmpty(criteria.SortExpression)) ? 기준.DefaultOrder : 기준.SortExpression;
return Wrap(sqlQuery, 순서, 기준.StartRowIndex, 기준.MaximumRows);
}
}
3부: 컬렉션 개체에서 호출됩니다. 여기는 RoleList입니다.
(SqlCommand cm = cn.CreateCommand()) 사용
{
cm.CommandType = CommandType.Text;
string sql = "SELECT * FROM 역할";
cm.CommandText = PagingWrapper.Wrap(sql, 기준);
(SafeDataReader dr = new SafeDataReader(cm.ExecuteReader())) 사용
{
동안(dr.Read())
추가(Role.FillRole(dr));
dr.NextResult();
dr.Read();
TotalRowCount = dr.GetInt32(0);
}
}CommandText는 Wrapper를 호출하여 반환됩니다. TotalRowCount 속성은 Csla.Core.IReportTotalRowCount 인터페이스의 구현입니다.
4단계: 페이지에서 데이터 소스 제어를 사용하고 Gridview를 바인딩하고 페이징을 구현합니다.
개인 int totalCount = 0;
protected void CslaDs_SelectObject(개체 전송자, Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList list = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = 목록;
totalCount = 목록.TotalRowCount;
}
protected void gvlist_RowDataBound(개체 전송자, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
((Label)e.Row.FindControl("lblTotal")).Text = totalCount.ToString();
}
}public static RoleList PagingRoleList(IDictionary paramDic, string SortExpression, int startRowIndex, int maximumRows)
{
return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex, maximumRows, SortExpression, "ID"));
}페이지 Gridview 페이지 매김 부분:
<페이저 템플릿>
<br />
총 <asp:Label ID="lblTotal" runat="server" ></asp:Label> 행
<asp:Label ID="lblPage" runat="server" Text='<%# "페이지" + (((GridView)Container.NamingContainer).PageIndex + 1) + "페이지/전체" + (((GridView) Container.NamingContainer).PageCount) + "페이지" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="페이지" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="이전 페이지" 활성화='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="페이지" CommandArgument="이전"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="서버" Text="다음 페이지" 활성화='<%# ((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="페이지" CommandArgument="마지막"></asp:LinkButton>
<br />
</PagerTemplate> 여기서 설명해야 할 것은 list.TotalRowCount 속성을 통해 전체 행 수를 구하므로 RoleList에서는 Csla.Core.IReportTotalRowCount 인터페이스를 구현해야 한다는 것입니다.
Gridview 및 PagerTemplate에 직접 총 행 수를 작성해 보면 어떨까요? 사실 이는 Gridview가 System.Web.UI.DataSourceSelectArguments 개체라는 속성을 노출하지 않기 때문입니다.
데이터를 얻은 후 총 행 수는 Gridview 내부로 반환되지만 Gridview는 개인 메서드에서 로컬 PagedDataSourse를 구성하고 그 안에 총 행 수를 기록합니다. 외부 또는 통해서는 얻을 수 없습니다. 반사.
따라서 가장 간단한 방법은 이를 먼저 기록한 다음 RowDataBound 이벤트에 작성하는 것입니다. 완벽함이 필요한 경우 Gridview를 직접 캡슐화하고 TotalRowCount 속성을 추가하고 노출할 수 있습니다.