Почему Page.PreviousPage всегда имеет значение null?

Я экспериментирую с публикацией на нескольких страницах, следуя этой статье MSDN. У меня есть этот код:

CrossPagePosting1.aspx

<form id="form1" runat="server">
    <h1>Page 1</h1>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
    <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="CrossPagePosting2.aspx"/>
</form>

CrossPagePosting2.aspx

<form id="form1" runat="server">
    <h1>Page 2</h1>
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</form>

CrossPagePosting2.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    TextBox TextBox1 = (TextBox)Page.PreviousPage.FindControl("TextBox1");
    Label1.Text = TextBox1.Text;
}

Этот код выше производит NullReferenceException в Page.PreviousPage, Зачем?

Это приложение ASP.Net 4.0.

Он использует FriendlyUrls, который используется по умолчанию.

ПРИМЕЧАНИЕ. Я НЕ хочу, чтобы предыдущая страница была строго напечатана, например, используя PreviousPageType директивы. Согласно ссылочной статье, это не должно быть необходимым.

5 ответов

Решение

Проблема здесь была вызвана FriendlyUrls, которые были установлены по умолчанию на тестовом сайте, на котором я работал. Я отключил FriendlyUrls, и это сработало.

Я обнаружил, что Friendly URLS может решить эту проблему. По умолчанию шаблон веб-форм включает в себя дружественные URL-адреса ASP.NET.

Когда вы используете Web Form по умолчанию из Visual Studio, AutoRedirectMode устанавливается на Постоянный. Это заставляет вас запрашивать "GET", и поскольку вы используете Friendly URLS, вы не можете оценить PreviousPage.

обходные:

  • Если вы хотите действие "POST", тогда установите AutoRedirectMode = RedirectMode.Off (это даст вам информацию PreviousPage, но только со страниц, не являющихся Friendly-Url [например: www.you.com/mypage.aspx], однако это получит Вы получаете ошибку, если пытаетесь получить доступ к странице Friendly-Url [например: www.you.com/mypage] << no .aspx).

  • Если вы хотите получить информацию о PreviousPage, вам нужно установить директиву предыдущего сообщения на вашей веб-странице <% @ PreviousPageType VirtualPath = "~ / Page1.aspx"%> ИЛИ, возможно, использовать Server.Transfer в методе OnClick.

Попробуй это

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && PreviousPage != null)
        {
            Page page = PreviousPage;
            Label1.Text = ((TextBox)page.FindControl("TextBox1")).Text;
        }
    }

Это происходит потому, что вы неправильно установили свойство postbackurl.

Если CrossPagePosting2.aspx находится в корне вашей программы, измените postbackurl на ~/CrossPagePosting1.aspx

Вам не нужно добавлять директиву <% @ PreviousPageType%> при использовании свойства postbackurl. используя PreviousPage.FindControl(id) будет искать элементы формы, которые публикуются с использованием свойства postbackurl

Я думаю, что следующая статья поможет вам.

http://csharpdotnetfreak.blogspot.com/2009/08/cross-page-posting-in-aspnet.html

Есть два способа использования кросс-постинга PostBack

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