我在项目中使用Datapager和ListView控件。 Datapager设置为使用查询字符串值Page,因此典型的URL如下所示:
http://mysite.com/Something.aspx?Page=2
问题是如果页面视图无效(例如0),ListView会抛出一个丑陋的错误。错误是:
Specified argument was out of the range of valid values.
Parameter name: startRowIndex
错误源自ListView SetPageProperties方法。
解决此问题的最佳方法是什么?我可以以某种方式覆盖SetPageProperties方法,以检查startRowIndex参数吗?
修改:这是一个非常简单的页面,可以复制错误:http://pastebin.com/3Mixy6aT
编辑2 :展示错误的简单Web应用程序项目的副本:http://www.mediafire.com/?8r222x5qim6cwrm
答案 0 :(得分:3)
此行为是v4.0中的新增功能。我无法使用v3.5重现它。它似乎是ASP.NET 4.0中的已知错误,但很难通过Google找到明确的引用。
我没有覆盖SetPageProperties
的{{1}},而是为ListView
OnInit
事件创建了一个事件处理程序,它检查查询字符串的相关参数。从我的测试来看,唯一导致异常的是页码参数为零或为负时。在这种情况下,我强制数据寻呼机忽略查询字符串(通过将DataPager
设置为null)。这反过来将导致数据寻呼机默认为第一页。
以下是代码:
QueryStringField
当然,您需要将 protected void DataPager_Init(object sender, EventArgs e)
{
var dp = sender as DataPager;
if (dp == null)
{
throw new Exception("This Event handler only works for DataPager web controls.");
}
string strPageNum = Request.QueryString[dp.QueryStringField];
if (strPageNum == null) return; // param not there, DataPager will use default
int pageNum = -1;
if (int.TryParse(strPageNum, out pageNum) && pageNum > 0)
{
return; // valid page number parameter, let DataPager handle it
}
dp.QueryStringField = null; // Force default
}
添加到OnInit="DataPager_Init"
网络控件的标记中。祝你好运。
答案 1 :(得分:0)
与评论过的其他人一样,我无法重现您的错误。如果查询字符串中的Page
参数以任何方式无效(例如参数缺失,数字超出范围,非数字数据),DataPager
将忽略它并默认为第1页。
此外,http://pastebin.com/3Mixy6aT的示例代码会引发异常,但原因不同。具体而言,没有LayoutTemplate
的服务器控件具有标识itemPlaceholder
。我添加了一个布局模板,无论您提供的页码如何,数据寻呼机都能正常工作。例如:
<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1">
<LayoutTemplate>
<asp:Literal ID="itemPlaceholder" runat="server"></asp:Literal>
<br />
</LayoutTemplate>
<ItemTemplate>
<%#Eval("UserID") %><br />
</ItemTemplate>
</asp:ListView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="Data Source=..."
SelectCommand="SELECT * FROM [Users]">
</asp:SqlDataSource>
Page:
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1"
PageSize="5" QueryStringField="Page">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
请注意,SetPageProperties
方法是DataPager
的成员,而不是ListView
。有趣的是,如果您使用此方法在后面的代码中设置无效的行号(例如-1),您将得到“参数超出范围错误”。此外,即使您缺少LayoutTemplate
,也会抛出此异常,因此它会掩盖您对布局模板可能遇到的任何问题。
我的结论是您的问题与查询字符串中的Page
参数无关。我建议您确保LayoutTemplate
正确,并且您没有在后面的代码中调用SetPageProperites
。 (如果您确实需要出于其他原因设置页面属性,可以发布一个新问题来处理。)