首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RIA服务-分页

RIA服务-分页
EN

Stack Overflow用户
提问于 2010-04-27 23:16:38
回答 5查看 1.3K关注 0票数 1

我正在测试RIA服务。我组装了一个RIA服务库,并构建了一个自定义DomainService (即,不是实体框架域服务)。我正在从Silverlight应用程序访问库,一切都如预期的那样工作。我可以调用RIA服务函数并获得结果。

我的问题是分页。我在任何地方都找不到在使用自定义domainServices的RIA服务上使用分页的描述。我的RIA服务正在访问一个专门的DAL来访问数据(并且与实体框架不兼容)。我所发现的是将分页参数(即页面、页面大小)传递给RIA服务函数的指示。因此,我已经做到了这一点-创建了一个RIA服务函数,该函数接受页面索引和页面大小的附加参数。我正在使用DataGrid和DataPager在Silverlight中测试这一点。带有分页参数的RIA服务被调用(并返回数据),并填充DataGrid。我遇到的问题是当我转到另一个页面时。发生的情况是RIA服务被调用了两次。第一次使用正确的参数(即正确的页面索引),然后再次使用页面索引0)。即总是重置到第一页。我不明白为什么会发生这种情况;我相信我把所有的东西都放在一起了(希望如此)。以下是XAML脚本:

代码语言:javascript
复制
<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)的返回列表

所以,我的问题是--有没有人看到过这种行为--或者我是不是犯了一个可怕的错误--如果是的话,我做错了什么?

彼得

EN

回答 5

Stack Overflow用户

发布于 2010-12-20 21:43:28

一旦我集成了上面提到的Legecay DAL库,所有这些都可以正常工作。回顾这个库-它很容易使用(但有一些阅读/回顾可以快速了解它)。还要确保您的RIA服务针对分页进行了正确配置。根据我所阅读和发现的内容-在页面导航和域数据源中设置页面大小是正常操作所必需的。ria服务调用还需要一个计数操作(对于特定的实体对象),该操作还返回最大记录计数(如果没有完成此操作,则可能会发生您提到的事情--域数据源不知道要通过-so分页的总记录。由于它没有足够的信息,因此可能只是从头开始--这通常很明显,因为分页浏览器不会显示适当的最大页面计数,或者最大页面显示为1或0)。

彼得

票数 1
EN

Stack Overflow用户

发布于 2010-07-09 21:25:33

好的--这需要一些调查。我不知道Ria Services的一些限制以及如何与客户端进行通信。根据我所发现的,分页信息是通过基于linq的操作传递给ria服务的。在这个级别上,我对Ria服务不是很了解,但我发现有人做了一些很好的工作,将一个库放在一起,通过一个自定义的DomainService公开分页信息。该库可在以下位置获得:http://riatodal.codeplex.com/

有关谁以及如何使用库的信息: ryanmwright.com/tag/ria-services

这个库用于更一般的东西,但重点放在使用MS.提供的Ria DomainServices的分页限制上。

彼得

票数 0
EN

Stack Overflow用户

发布于 2010-12-10 02:38:30

嗯,看起来你做了一些让人困惑的事情。我认为您已经加倍了您的分页逻辑,并且您在服务器上手动分页,并且在客户机上具有域数据源控制分页。

您已经将LoadSize属性设置为20。这将告诉RIA Services,您希望一次对包含20条记录的块中的数据进行分页。因此,如果底层的域操作ddsScheduleTemplates返回50条记录,您将获得三个页面,并且域数据源控件将自动附加.Take(20)和一个.Skip(##),以将结果集过滤到一次只有一页。

但是,由于您有用于PagePageSize的参数,因此似乎还向域操作添加了参数以支持分页。我假设如果您传入Page=2PageSize=20,那么您将在服务器上的Linq查询中附加一个.Skip(40)和一个.Take(20)。如果是这种情况,那么域数据源控件将认为只有20条记录,因为这是您的操作将返回的最多记录。因此,将只有一页。

如果这还不能解决问题,那就发布服务器端域操作的代码,我会看看是否可以为您解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2722416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档