2011-03-29 8 views
0

Я использую Datapager в моем проекте с элементом управления ListView. DataPager установлен использовать значение строки запроса страницы, так что типичный URL выглядит следующим образом:DataPager выдает ошибку, когда значение querystring недействительно

http://mysite.com/Something.aspx?Page=2

Проблема заключается в том, что ListView бросает уродливую ошибку, если просмотр страницы недействителен (0, например). Ошибка:

Specified argument was out of the range of valid values. 
Parameter name: startRowIndex 

Ошибка возникает в методе ListView SetPageProperties.

Каков наилучший способ решить эту проблему? Могу ли я переопределить метод SetPageProperties, чтобы проверить параметр startRowIndex?

Edit: здесь очень простая страница, которая повторяет ошибку: http://pastebin.com/3Mixy6aT

Edit 2: копия простого WebApplication проекта, демонстрирующего ошибку: http://www.mediafire.com/?8r222x5qim6cwrm

+1

Какое поведение вы ожидаете вместо текущего ('ArgumentOutOfRangeException')? – Alex

+0

Я не против исключения, но я не могу понять, где бы я справился с этим? Page_Init? –

+2

Я просто проверил простой тест, и я не смог воспроизвести вашу ошибку. Независимо от того, какой мусор я бросил в querystring, ListView/DataPager грациозно обрабатывал все. Можете ли вы поделиться больше кода, как вы связываете ListView? –

ответ

4

Это поведение является новым в версии 4.0. Я не могу воспроизвести его, используя v3.5. По-видимому, это известная ошибка в ASP.NET 4.0, но трудно найти четкие ссылки через Google.

Вместо того, чтобы переопределить SetPageProperties из ListView, я создал обработчик события для OnInit случае DataPager, который проверяет соответствующий параметр строки запроса. Из моего тестирования единственное, что вызывает исключение, - это когда параметр номера страницы был нулевым или отрицательным. В этом случае я заставляю пейджер данных игнорировать строку запроса (установив QueryStringField в null). Это, в свою очередь, приведет к тому, что пейджер данных по умолчанию будет на первой странице.

Вот код:

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" разметке для <asp:DataPager> веб-управления. Удачи.

+0

Awesome, работает прекрасным! Любая идея, почему у меня есть ошибка, несмотря на использование .Net 4.0? Кстати, я перезапустил щедрость на вопрос, чтобы я мог его наградить. Вы этого заслуживаете;) Так что я позволю себе наградить его через 23 часа (так как он истек). Тогда наградит. Приветствия. –

+0

@ Постепенно «new in 4.0» я имел в виду, что нежелательное поведение нового в версии 4.0. Я не хочу называть это ошибкой, не зная больше, но мне кажется, что это похоже на меня. –

+0

Ой, мой плохой. Я вижу - это действительно очень странно. –

1

Как с теми, кто комментировал , Я не могу воспроизвести вашу ошибку. Если параметр 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 в код позади. (Если вам действительно нужно установить свойства страницы по какой-либо другой причине, вы можете опубликовать новый вопрос, чтобы справиться с этим.)

+0

Странно - я не встречал исключения без LayoutTemplate. Я добавил LayoutTemplate, но я все еще получаю ошибки, когда я ставил page = 0 в querystring (в файле кода нет ничего). Может быть, у меня есть другая версия контроля? –

+0

@Perpetually - Какую версию ASP.NET вы используете? –

+0

Должна быть версия 4.0, хотя проект изначально был импортирован из проекта 2.0. Есть ли способ узнать наверняка? –

Смежные вопросы