Недопустимая ошибка состояния просмотра при публикации на той же странице
У меня есть некоторые проблемы с ошибкой Invalid Viewstate, и я могу понять, почему это происходит, но я не знаю, как это исправить.
У меня есть страница, которая похожа на это /story/?id=123
но я использую другую страницу для Server.Transfer
на эту страницу.
Итак, я настроил /info
в Server.TransferRequest("/story/?id=123")
и он работает нормально, пока страница не выполняет обратную передачу для себя.
У нас есть форма входа на этой странице, которая просто перезагружает страницу, но когда это происходит, она добавляет /?id=123
в конце URL, так что это заканчивается так /info/?id=123
таким образом вызывая ошибку Invalid Viewstate.
Я уже пробовал добавлять EnableViewStateMac="false"
- это исправляет ошибку, но не регистрирует пользователя, как ожидалось, поэтому не дает требуемого результата.
Итак, мои вопросы:
Есть ли лучший способ перенаправить на мою страницу, кроме
Server.TransferRequest
но все еще сохраняете хороший URL? - Я не хочуResponse.Redirect
если я могу избежать этого.Если нет, есть ли простой способ исправить эту ошибку, которая не требует добавления
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 не запускает проверку подлинности сообщения.ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Шаги по воспроизведению поведения
Создайте страницу 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>
Создайте еще одну страницу 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>
Откройте WebForm1.aspx в своем браузере и нажмите " Отправить".