0

我在我的项目中使用带有 ListView 控件的 Datapager。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

4

2 回答 2

3

此行为是 v4.0 中的新行为。我无法使用 v3.5 重现它。它似乎是 ASP.NET 4.0 中的一个已知错误,但很难通过 Google 找到明确的参考。

我没有覆盖SetPagePropertiesof ,而是为 的事件ListView创建了一个事件处理程序,它检查查询字符串的相关参数。根据我的测试,导致异常的唯一原因是页码参数为零或负数。在这种情况下,我强制数据寻呼机忽略查询字符串(通过将 设置为 null)。这反过来将导致数据寻呼机默认为第一页。OnInitDataPagerQueryStringField

这是代码:

    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
    }

当然,您需要为Web 控件添加OnInit="DataPager_Init"标记。<asp:DataPager>祝你好运。

于 2011-04-07T22:23:47.160 回答
0

与其他评论过的人一样,我无法重现您的错误。如果Page查询字符串中的参数以任何方式无效(例如参数丢失、数字超出范围、非数字数据),则DataPager忽略它并默认为第 1 页。

此外, http ://pastebin.com/3Mixy6aT上的示例代码会引发异常,但原因不同。具体来说,没有LayoutTemplate具有 id 的服务器控件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),你会得到一个“argument out of range error”。此外,即使您缺少 ,也会引发此异常LayoutTemplate,因此它将掩盖您在布局模板中可能遇到的任何问题。

Page我的结论是您的问题与查询字符串中的参数无关。我建议您确保您LayoutTemplate是正确的,并且您没有SetPageProperites在后面的代码中调用。(如果您确实需要出于其他原因设置页面属性,您可以发布一个新问题来处理该问题。)

于 2011-04-06T15:34:30.613 回答