Почему 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