Недопустимая ошибка состояния просмотра при публикации на той же странице

У меня есть некоторые проблемы с ошибкой Invalid Viewstate, и я могу понять, почему это происходит, но я не знаю, как это исправить.

У меня есть страница, которая похожа на это /story/?id=123 но я использую другую страницу для Server.Transfer на эту страницу.

Итак, я настроил /info в Server.TransferRequest("/story/?id=123") и он работает нормально, пока страница не выполняет обратную передачу для себя.

У нас есть форма входа на этой странице, которая просто перезагружает страницу, но когда это происходит, она добавляет /?id=123 в конце URL, так что это заканчивается так /info/?id=123 таким образом вызывая ошибку Invalid Viewstate.

Я уже пробовал добавлять EnableViewStateMac="false" - это исправляет ошибку, но не регистрирует пользователя, как ожидалось, поэтому не дает требуемого результата.

Итак, мои вопросы:

  1. Есть ли лучший способ перенаправить на мою страницу, кроме Server.TransferRequest но все еще сохраняете хороший URL? - Я не хочу Response.Redirect если я могу избежать этого.

  2. Если нет, есть ли простой способ исправить эту ошибку, которая не требует добавления EnableViewStateMac="false"?

1 ответ

Решение

http://support.microsoft.com/kb/316920

Я полагаю, что эта статья объяснит, почему у вас возникла проблема, и даст решение для ее устранения.

Я знаю, что вы не хотите использовать Response.Redirect, но я думаю, что это также решит проблему.

PRB: сообщение об ошибке "Просмотр состояния неверно" при использовании Server.Transfer

Эта статья была ранее опубликована под Q316920

Отказ от ответственности за содержание базы данных

Эта статья была написана о продуктах, для которых Microsoft больше не предлагает поддержку. Поэтому эта статья предлагается "как есть" и больше не будет обновляться.

СИМПТОМЫ

Когда вы используете HttpServerUtility.Transfer("page name", true), вы получите следующее сообщение об ошибке:

Состояние просмотра недопустимо для этой страницы и может быть повреждено

ПРИЧИНА

Эта проблема возникает из-за EnableViewStateMac атрибут <pages> элемент установлен в true по умолчанию. Если для этого атрибута установлено значение true, ASP.NET запускает проверку подлинности сообщений (MAC) в состоянии просмотра страницы, когда страница отправляется обратно от клиента. Эта проверка определяет, было ли изменено состояние просмотра страницы на клиенте. В целях безопасности рекомендуется оставить для этого атрибута значение true,

Когда вы звоните Server.Transfer метод и установите второй параметр true сохраняешь QueryString и Form коллекции. Одним из полей формы является скрытое поле формы __VIEWSTATE, в котором хранится состояние просмотра страницы. Проверка подлинности сообщения состояния просмотра завершается неудачно, поскольку проверка подлинности сообщения проверяет только каждую страницу. Таким образом, состояние просмотра со страницы, которая вызывает Server.Transfer недопустимо на странице назначения.

Состояние просмотра ограничено областью и действительно только для этой страницы. Состояние просмотра не должно передаваться по страницам.

РАЗРЕШАЮЩАЯ СПОСОБНОСТЬ

Чтобы решить эту проблему, используйте один из следующих методов.

Разрешение 1

Передача значений между страницами для передачи значений управления сервером на другие страницы. Для получения дополнительной информации обратитесь к следующей документации MSDN: Передача значений серверного элемента управления между страницами Для этого необходимо создать общие свойства для каждого свойства элемента управления, к которому вы хотите получить доступ со страницы назначения.

Если у вас много элементов управления и вы хотите получить доступ к свойствам этих элементов управления с другой страницы, вы также можете объявить эти элементы управления как открытые переменные. Например:

Page1.aspx

Public Class Page1
    Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox

    'Insert your code here.
End Class

Page2.aspx

Dim sourcePage As Page1
sourcePage = CType(Context.Handler, WebForm1)
Response.Write(sourcePage.TextBox1.Text)

Разрешение 2

Не передавайте второй параметр (который false по умолчанию) при звонке Server.Transfer, Например:

Server.Transfer("<page name>")

Этот код не отправляет QueryString и Form поля на странице, которая называется. Когда данные не передаются, ASP.NET не запускает проверку подлинности сообщения.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Шаги по воспроизведению поведения

  1. Создайте страницу ASPX с именем WebForm1.aspx, которая передает выполнение на другую страницу. Добавьте следующий код в WebForm1.aspx:

    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>  
      <body>  
        <form id="WebForm1" method="post" runat="server">
          <asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>
          <asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
        </form>   
      </body>
    </html>
    
    <script runat=server>
    Sub Button1_Click(sender As Object, e As System.EventArgs)
      Server.Transfer("WebForm2.aspx",true)
    End Sub
    
    </script>
    
  2. Создайте еще одну страницу ASPX с именем WebForm2.aspx, а затем добавьте следующий код:

    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>
      <body>  
        <form id="WebForm2" method="post" runat="server">
          <asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
        </form>
    
      </body>
    </html>
    
    <script runat=server>
    Sub Page_Load(sender As Object, e As EventArgs)
    
    Dim thisPage As System.Web.UI.Page
    Dim nameTextBox As TextBox
    
      thisPage = CType(Context.Handler, System.Web.UI.Page)
      nameTextBox =  CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
    
      lblName.Text = "Your name is '" & nameTextBox.Text & "'."   
    
    End Sub
    
    </script>
    
  3. Откройте WebForm1.aspx в своем браузере и нажмите " Отправить".

Другие вопросы по тегам