Как остановить, чтобы сайт ASP.Net выдавал исключение HttpUnhandledException при просмотре вперед / назад по постраничному списку элементов? - PullRequest
5 голосов
/ 02 декабря 2008

У меня есть веб-сайт ASP.Net, который отображает список результатов в виде DataGrid или ASP.Net Repeater с разбивкой по страницам результатов.

Если быстро прокрутить страницы, нажимая вкладки «Предыдущая / Следующая», иногда выдается исключение HttpUnhandledException и отображается страница отладки вместо следующего списка результатов.

Экран отладки выглядит следующим образом:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
  at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument)
  at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument)
  at System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument)
  at System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
  at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
  at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  --- End of inner exception stack trace ---
  at System.Web.UI.Page.HandleError(Exception e)
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  at System.Web.UI.Page.ProcessRequest()
  at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
  at System.Web.UI.Page.ProcessRequest(HttpContext context)
  at ASP.contacts_default_aspx.ProcessRequest(HttpContext context)
  at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
  at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Я нашел ссылку на такую ​​ошибку в http://blogs.msdn.com/amitsh/archive/2007/07/31/why-i-get-invalid-postback-or-callback-argument-errors.aspx

но для решения рекомендуется установить значение false, но, похоже, это создает дыру в безопасности. В комментариях рекомендуется несколько альтернатив, но все они кажутся довольно сложными, поскольку требуют добавления кода для каждого отдельного элемента управления DataGrid или Repeater, используемого на моем сайте.

Есть ли более общее решение, которое можно сделать, не жертвуя безопасностью?

1 Ответ

9 голосов
/ 02 декабря 2008

Скрытые поля на вашей странице не предоставляются при обратной передаче. Существует несколько таких полей, и они обычно требуются для «магии», предоставляемой ASP.Net.

В вашей директиве страницы вы можете включить enableEventValidation = false в вашей директиве страницы, чтобы отключить ее, однако это может быть нежелательно .

Вы можете переместить код записи для перемещения элементов вверх страницы

Наконец, я вполне уверен, что эта проблема была недавно исправлена ​​в пакете обновления или в 3.5.

- РЕДАКТИРОВАТЬ -

Я только что нашел параметр: RenderAllHiddenFieldsAtTopOfForm

Согласно MSDN поддерживается в следующих версиях: 3.5 SP1, 3.0 SP2, 2.0 SP2

...