Я использую CSLA.NET для работы над веб-проектом и обнаружил, что модель CSLA не очень подходит для национальных условий Китая при разработке Интернета.
Все его серии шаблонов основаны на рассмотрении основных форм, таких как «Заказ на закупку», который имеет один заголовок и строки сведений, что отлично подходит для WinForm.
Но в Интернете большинство объектов редактируются с использованием отдельной формы, поэтому это немного неудобно.
Понимание у меня пока не глубокое, и я все еще учусь. Весь фреймворк мне очень помог. Хватит ерунды, перейдем к делу.
Чтобы удобно использовать подкачку Sql2005 в модели CSLA, нам нужно выполнить четыре шага.
Шаг 1. Реализуйте PagingCriteria для передачи параметров подкачки.
[Сериализуемый()]
общедоступный класс PagingCriteria<T>: CriteriaBase
{
#region Подано
общественный IDictionary ParamDic {получить; частный набор};
общественная строка SortExpression {получить; частный набор}
общественная строка DefaultOrder {получить; частный набор}
общественный ИНТ StartRowIndex {получить; частный набор}
общественный ИНТ MaximumRows {получить; частный набор}
#конечныйрегион
protectedPagingCriteria(){ }
public PagingCriteria (IDictionary paramDic, int startRowIndex, int MaximumRows, string sortExpression, string defaultOrder)
: база(тип(T))
{
ПарамДик = парамДик;
Выражение Сортировки = Выражение Сортировки;
Ордер по умолчанию = Ордер по умолчанию;
StartRowIndex = startRowIndex;
МаксимумРовс = МаксимумРовс;
}
}
Шаг 2. Реализуйте PagingWrapper для инкапсуляции обычных операторов Sql в операторы подкачки.
общедоступный статический класс PagingWrapper
{
частная константная строка SQLTEMPLATE = @" С TargetTable AS (выберите ROW_NUMBER() OVER (упорядочить по Temp. {1}) как RowNumber, Temp.* from ({0}) как Temp) выберите * из TargetTable WHERE RowNumber между {2} и {3};Выберите счетчик(*) из ({0}) Temp";
общедоступная статическая строка Wrap (строка sqlQuery, строка SortExpression, int startRowIndex, int MaximumRows)
{
если (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.ТипКоманды = ТипКоманды.Текст;
строка sql = "ВЫБРАТЬ * ИЗ Ролей";
cm.CommandText = PagingWrapper.Wrap(sql, критерии);
используя (SafeDataReader dr = новый SafeDataReader(cm.ExecuteReader()))
{
в то время как (доктор.Read())
Добавить(Роль.FillRole(др));
доктор.СледующийРезультат();
доктор.Читать();
TotalRowCount = dr.GetInt32(0);
}
}CommandText возвращается при вызове Wrapper. Свойство TotalRowCount является реализацией интерфейса Csla.Core.IReportTotalRowCount.
Шаг 4. Используйте элемент управления источником данных на странице, привяжите Gridview и реализуйте разбиение по страницам:
частный ИНТ TotalCount = 0;
protected void CslaDs_SelectObject (отправитель объекта, Csla.Web.SelectObjectArgs e)
{
Список BLL.Security.RoleList = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = список;
TotalCount = список.TotalRowCount;
}
protected void gvlist_RowDataBound (отправитель объекта, GridViewRowEventArgs e)
{
если (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='<%# "Page" + (((GridView)Container.NamingContainer).PageIndex + 1) + "Pages/Total" + (((GridView) Container.NamingContainer).PageCount) + "страница" %> '></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="Prev"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="Next Page" 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 и предоставить его.