В прошлой статье по передаче данных между windows forms мы рассмотрели организацию процесса обмена данными между формами Windows Forms
В этой статье мы рассмотрим множество способов для организации межстраничной передачи данных. Другими словами, когда загрузка некоторой страницы так, или иначе происходит с другой страницы и при этом требуется получить данные предыдущей страницы. Когда загрузка некоторой страницы происходит с той же страницы, то получить состояние контролов и данных самой страницы совсем не составляет труда, но ситуация с межстраничной пересылкой для некоторых разработчиков сопряжена с определенными трудностями.
Итак, постановка вопроса.
Есть две страницы Default1.aspx и Default2.aspx. На первой имеется два контрола TextBox1и Button1, на второй TextBox2:

Требуется отобразить значение, введенное в текстовое поле TextBox1 на первой вебформе, в текстовом поле TextBox2 второй формы.
Вариант 1. Server.Transfer
В первой форме подписываемся на обработчик события нажатия на кнопке и внутри обработчика выполняем Server.Transfer:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("~/Default2.aspx");
}
}
А у второй формы в методе Page_Load находим контрол первой формы TextBox1:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.TextBox2.Text =
(Page.PreviousPage.FindControl("TextBox1")
as TextBox).Text;
}
}
Введя текст в текстовое поле на странице Default1.aspx и нажав на кнопку мы попадем на вторую страницу Default2.aspx, на которой в текстовом поле будет находиться значение из текстбокса первой страницы.
Вариант 2. Response.Redirect
Данный метод использует строку адреса для передачи дополнительных параметров. После нажатия на кнопке, в обработчике события выполняем редирект с параметром, значение которого устанавливаем в значение свойства Text текстового поля:
public partial class _Default1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("~/Default2.aspx?val="+TextBox1.Text);
}
}
А на второй странице вытягиваем значение параметра из строки адреса:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.TextBox2.Text = Request.QueryString["val"];
}
}
Конечно, метод
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("~/Default2.aspx?val=" + TextBox1.Text);
}
может достичь того же результата и инструкцией
Server.Transfer("~/Default2.aspx?val=" + TextBox1.Text)
Но в этом случае в строке адреса так и останется название первой страницы, что дизориентирует пользователя, ведь фактически он будет находится на второй странице, а в строке адреса по прежнему отображается первая страница. Зато пользователь не видит какие параметры передаются на вторую страницу, ведь метод Server.Transfer в отличие от Response.Redirect выполняется на сервере, а не на клиенте.
Вариант 3. Session
Возможно и использование сессий. Для хранения некоторых данных между отправкой запросов к страницам сайта (веб-приложения) можно воспользоваться сессиями. Перед загрузкой второй страницы, данные текстового поля первой страницы помещаем в сессию, а при загрузке второй страницы достаем эти данные из сессии:
public partial class _Default1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//устанавливаем сессию
Session["Value"] = TextBox1.Text;
Response.Redirect("~/Default2.aspx");
}
}
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//считываем сессию
this.TextBox2.Text = Session["Value"].ToString();
}
}
Вариант 4. Cвойство PostBackUrl
Кнопке Button1 установите свойство PostBackUrl="~/Default2.aspx". Это всё, что требуется от первой формы:
<body>
<form id="form2" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button"
PostBackUrl="~/Default2.aspx" />
</div>
</form>
</body>
А во второй форме опять таки:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.TextBox2.Text =
(Page.PreviousPage.FindControl("TextBox1")
as TextBox).Text;
}
}
Вариант 5. Класс Context
Данный способ является неоправданно редко используемым и самым менее известным. Но в то же время самый интересный. Суть заключается в том, что бы с помощью контекста получить экземпляр первой веб-формы.
Бихай код первой страницы:
public partial class _Default1 : System.Web.UI.Page
{
public string TextBox1Value { get; private set; }
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
TextBox1Value = TextBox1.Text;
Server.Transfer("~/Default2.aspx");
}
}
Здесь мы для наглядности добавили свойство TextBox1Value, а в обработчике Button1_Click устанавливаем его в значение свойства Text текстового поля.
А вот бихайн-код второй страницы:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
_Default1 form1 = (_Default1)Context.Handler;
this.TextBox2.Text = form1.TextBox1Value;
}
}
Самое интересное заключено в конструкции _Default1 form1 = (_Default1)Context.Handler;
Как видите для создания экземпляра клсасса _Default1 (первая страница), мы воспользовались отличнейшим классом Context и его свойством Handler.
Но есть еще более простой способ получения экземпляра предыдущей страницы:
_Default1 form1 = (_Default1)PreviousPage;
Какой способ выбирать? Все зависит от ситуации. Каждый из них имеет свои плюсы и свои недостатки. Главное перед выбором одного из вариантов ответьте себе на такие вопросы:
- Как представлять строку адреса;
- Отображать ли параметры в строке адреса;
- Стоит ли получать контролы формы-инициатора отправки запроса;
- Будет ли работа с полями клсса формы-инициатора;
- И главное, какой размер передаваемых данных и насколько скрытыми от пользователя они должны быть.