当查询字符串值无效时,DataPager会引发错误

时间:2011-03-29 04:06:36

标签: asp.net listview datapager

我在项目中使用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

2 个答案:

答案 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。 (如果您确实需要出于其他原因设置页面属性,可以发布一个新问题来处理。)