2010-04-27 5 views
1

Я тестирую службы RIA. Я собрал библиотеку RIA Services и создал собственный DomainService (т. Е. Не доменную службу Entity Framework). Я обращаюсь к библиотеке из приложения Silverlight, и все работает так, как ожидалось. Я могу вызвать сервисные функции RIA и получить результаты.Услуги RIA - разбивка на страницы

Моя проблема с разбиением на страницы. Я не могу найти нигде описание использования разбивки на страницы в службе RIA, которая использует собственные службы домена. Служба RIA имеет доступ к специализированному DAL для доступа к данным (и не совместима с платформой Entity Framework). То, что я нашел, было признаком, чтобы передать параметры разбивки на страницы (например, страницу, размер страницы) на функцию службы RIA. Таким образом, я сделал именно это - создал сервисную функцию RIA, которая принимает дополнительные параметры для Page [index] и Page size. Я тестирую это в Silverlight с помощью DataGrid и DataPager. Служба RIA с параметрами разбивки на страницы называется (и возвращает данные), и DataGrid заполняется. Проблема, с которой я сталкиваюсь, - это когда я перехожу на другую страницу. Случается, что служба RIA вызывается дважды. Первый раз с правильными параметрами (то есть правильный индекс страницы), а затем с индексом страницы нуля). То есть всегда сбрасывается на первую страницу. Я не понимаю, почему это происходит; Я считаю, что все правильно поставил (надеюсь). Ниже приведен XAML сценарий:

<riaControls:DomainDataSource 
    Name="ddsScheduleTemplates"       
    LoadSize="20" 
    QueryName="GetPagedScheduleTemplates" 
    AutoLoad="True" 
> 

    <riaControls:DomainDataSource.DomainContext> 
     <ds:ScheduleEngineDomainContext/> 
    </riaControls:DomainDataSource.DomainContext> 

    <riaControls:DomainDataSource.QueryParameters> 
     <riaControls:Parameter ParameterName="UserLogonName" Value="admin" /> 
     <riaControls:Parameter ParameterName="UserPassword" Value="admin" /> 
     <riaControls:Parameter ParameterName="Page" Value="{Binding ElementName=dpScheduleTemplates, Path=PageIndex}" /> 
     <riaControls:Parameter ParameterName="PageSize" Value="{Binding ElementName=dpScheduleTemplates, Path=PageSize}" /> 
    </riaControls:DomainDataSource.QueryParameters> 

</riaControls:DomainDataSource> 

<StackPanel> 

    <dg:DataGrid 
     Name="ScheduleTemplatesGrid" 
     MinHeight="100" 
     MaxHeight="300" 
     IsReadOnly="True" 
     ItemsSource="{Binding ElementName=ddsScheduleTemplates, Path=Data}" 
    /> 

    <dg:DataPager 
     x:Name="dpScheduleTemplates" 
     PageSize="10" 
     Source="{Binding ElementName=ddsScheduleTemplates, Path=Data}" 
     PageIndexChanged="dpScheduleTemplates_PageIndexChanged" 
    /> 

</StackPanel> 

Я изменил выше скрипт для вызова общей функции загрузки (GetPagedScheduleTemplates - возвращает все записи) и корректируется список QueryParameters для функции. DataGrid загружается правильно - и разбиение на страницы работает правильно.

Это смутило меня - это похоже на то, что DataPager требовал, чтобы все данные были загружены для того, чтобы он работал правильно, но я проверил, где я загрузил все данные в операцию постраничного запроса; (т. е. настройки свойств постраничной привязки и вызов версии страницы службы RIA), но DataGrid все еще сбрасывается.

Примечание: я прочитал, что DataPager требует, чтобы список возврата был заказан - так что я сделал это - но не повлиял на операцию - пейджинг всегда сбрасывается на страницу 1 - следующий список возврата из служебной функции RIA newList.ToArray(). AsQueryable(). OrderBy (x => x.ScheduleTemplateID)

So; мой вопрос: кто-нибудь видел это поведение - или я делаю ужасную ошибку - если да, то что я делаю неправильно?

Peter

ответ

0

Хорошо - это потребовало некоторого расследования. Я не знал о некоторых ограничениях служб Ria и о том, как происходит общение с клиентом. Из того, что я узнал, информация разбиения на страницы привязана к службе ria с помощью операций на основе linq. Я не слишком занимаюсь услугами Ria на этом уровне, но я нашел того, кто проделал какую-то хорошую работу, чтобы собрать библиотеку, которая предоставляет информацию разбивки на страницы с помощью пользовательского DomainService. Библиотека доступна по адресу: http://riatodal.codeplex.com/

Информация о том, кто и как использовать библиотеку: ryanmwright.com/tag/ria-services

Эта библиотека предназначена для чего-то более общего, но основное внимание уделяется ограничениям постраничной с предоставленными Ria DomainServices от MS.

Питер

0

Ну, похоже, что вы сделали что-то запутанное. Я думаю, что вы удвоили свою логику подкачки, и вы вручную подкачки на сервере, и у вас есть подкачка контроля домена Datasource на клиенте.

Вы установили для атрибута LoadSize значение 20. Это сообщает службам RIA, которые вы хотите пролистывать данные в блоках по 20 записей за раз. Таким образом, если операция основного домена ddsScheduleTemplates возвращает 50 записей, вы получите три страницы, а элемент управления Datasource домена автоматически добавит .Take(20) и .Skip(##), чтобы отфильтровать набор результатов только на одну страницу за раз.

Однако, похоже, что вы добавили параметры в свою операцию домена для поддержки пейджинга, потому что у вас есть параметры для Page и PageSize. Я предполагаю, что если вы передадите Page=2 и PageSize=20, что вы добавляете .Skip(40) и .Take(20) в свой запрос Linq на сервере. Если это так, то Domain Datasource Control будет считать, что есть только 20 записей, потому что это больше всего ваша операция вернется. Итак, будет только одна страница.

Если это не поможет, отправьте код для операции с доменом на стороне сервера, и я увижу, могу ли я решить проблему для вас.

0

То, что делалось, было связано с проблемой, которую я пытался решить. Как я уже говорил, я использую собственный DomainService, потому что мне нужно было работать с устаревшим DAL. Я не мог понять, как заставить вещи работать с разбивкой по страницам - одно из предложений, которое я прочитал, заключалось в том, чтобы предоставить настраиваемые параметры поискового вызова в качестве параметров запроса. Это не сработало слишком хорошо - на самом деле это совсем не так, возможно, из-за отсутствия страницы PageSize - но считалось, что это может не потребоваться при выполнении пользовательского пейджинга.

С учетом сказанного, как я упоминал в своем предыдущем комментарии (после исследования), я нашел красивую библиотеку, которая позволяет включить устаревший DALS в DomainService и предоставляет логику, найденную в предоставляемых MS RIA службах Entity Framework , Это решило мою проблему.

0

У меня такая же проблема, что и вы. Что произойдет, если вы перейдете непосредственно на страницу X? Datapager возвращается на страницу 1? Для меня, если я перейду непосредственно на какую-то страницу, все будет хорошо, но если я нажму на следующий или предыдущий, он перейдет на страницу 1.

1

Как только я включил библиотеку Legelay DAL, о которой я говорил выше, все было исправно. Просмотрите библиотеку - она ​​проста в использовании (но есть некоторые чтения/обзора, чтобы ускориться с ней). Также убедитесь, что ваша служба RIA правильно настроена для разбивки на страницы. Из того, что я прочитал и нашел - для правильной работы требуется настройка размера страницы в источнике данных пейджера и домена. Сервисный вызов ria также требует операции подсчета (для конкретного объекта объекта), которые возвращают счет MAX-записи (если это не сделано, могут произойти такие вещи, как вы упомянули), источник данных домена не знает, что общие записи для разбивки на страницы через -so он может просто начать, потому что у него недостаточно информации - это общепринято, потому что пейджер не будет показывать правильное количество страниц в макете или покажет 1 или ноль для максимальной страницы).

Peter

+0

Будет здорово, если вы мало-мальски отформатируете свои ответы. :) –

Смежные вопросы