2010-04-27 100 views
1

我正在測試RIA服務。我將RIA Services庫放在一起,並構建了一個自定義的DomainService(即不是實體框架域服務)。我正在從Silverlight應用程序訪問該庫,並且所有工作都按預期工作。我可以調用RIA服務函數並獲得結果。RIA服務 - 分頁

我的問題是與分頁。我無法在任何地方找到在使用自定義域名服務的RIA服務上使用分頁的描述。我的RIA服務正在訪問專門的DAL以訪問數據(並且與實體框架不兼容)。我發現的是將分頁參數(即頁面,頁面大小)傳遞給RIA服務功能的指示。所以我已經完成了 - 創建了一個RIA服務函數,它爲Page [index]和Page size增加了額外的參數。我正在使用DataGrid和DataPager在Silverlight中進行測試。具有分頁參數的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)

所以;我的問題是 - 有沒有人看到過這種行爲 - 或者我犯了一個可怕的錯誤 - 如果是的話,我做錯了什麼?

彼得

回答

0

好的 - 好吧,這需要一些調查。我沒有意識到Ria服務的一些侷限性以及客戶與客戶之間的溝通方式。從我發現的分頁信息通過基於linq的操作被提交給ria服務。在這個級別上,我不太喜歡Ria服務,但是我發現有人已經做了一些很好的工作來將通過自定義DomainService公開分頁信息的庫放在一起。該庫可在: http://riatodal.codeplex.com/

信息對誰以及如何使用該庫: ryanmwright.com/tag/ria-services

這個庫是爲更多的東西一般,但側重於分頁限制使用MS提供的Ria DomainServices。

Peter

0

好吧,它看起來像你做了一些混淆。我認爲你的分頁邏輯增加了一倍,並且你在服務器上手動分頁,並且在客戶端上有Domain Datasource Control分頁。

您已將LoadSize屬性設置爲20.這會告訴RIA服務您要逐頁掃描20條記錄中的數據。因此,如果底層域操作ddsScheduleTemplates返回50條記錄,則您將獲得三個頁面,並且域數據源控件將自動附加.Take(20).Skip(##)以將結果集一次過濾爲僅一個頁面。

但是,它也顯示您已將參數添加到您的域操作以支持分頁,因爲您有參數PagePageSize。我假設如果你通過Page=2PageSize=20,你在服務器的Linq查詢中追加.Skip(40).Take(20)。如果是這種情況,那麼域數據源控制將認爲只有20條記錄,因爲這是您的操作將返回的最多。所以,只會有一個頁面。

如果這沒有幫助,那麼發佈您的服務器端域操作的代碼,我會看看我是否可以爲您解決問題。

0

正在做的事與我試圖解決的問題有關。正如我所提到的,我使用的是自定義的DomainService,因爲我需要使用傳統的DAL。我無法弄清楚如何讓事情在分頁方面有效 - 我讀過的一個建議是提供自定義分頁參數作爲查詢參數。這不太好 - 實際上根本就沒有 - 可能是因爲缺少PageSize - 但認爲如果進行自定義分頁可能不需要。

正如我在之前的評論(研究後)中提到的那樣,我找到了一個很好的庫,允許將遺留的DALS合併到DomainService中,並提供MS RIA提供的Entity Framework域服務。這解決了我的問題。

0

我有同樣的問題,你。如果直接進入第X頁,會發生什麼? Datapager返回到第1頁?對我來說,如果我直接進入某個頁面,一切正常,但是如果我點擊下一個或上一個頁面,它將跳轉到第1頁。

1

一旦我整合了前面提到的Legecay DAL庫,所有工作都正常。查看圖書館 - 它很容易使用(但有一些閱讀/審查,以加快速度)。還要確保您的RIA服務已正確配置爲分頁。從我已閱讀和發現的內容 - 在尋呼機和域數據源中設置頁面大小是正確操作所必需的。 ria服務調用還需要一個計數操作(對於特定的實體對象),它也返回MAX記錄計數(如果沒有這樣做,那麼可能會出現像您提到的情況 - 域數據源不知道要分頁的總記錄通過 - 所以它可能只是開始,因爲它沒有足夠的信息 - 這很明顯,因爲尋呼機將不會顯示適當的最大頁數或將顯示1或0的最大頁面)。

彼得

+0

這將是偉大的,如果你littlebit格式化你的答案。 :) – 2012-12-04 08:56:04