Когда вы выполняете HttpServerUtility.Transfer со страницы 1 на страницу 2, HttpContext затем разделяется между страницей 1 и страницей 2. Поэтому обычно один запрос означает один обработчик запроса (обычно страницу) и один контекст запроса. Но в этом случае есть два обработчика и один (общий) контекст. Вы можете использовать контекст для обмена информацией о запросе между двумя обработчиками.
Таким образом, одним из решений может быть то, что Страница 1 помещает все данные, которые нужны странице 2, в HttpContext.Items. Затем сначала проверяются эти данные. Если имеется, страница 2 знает, что управление было передано посредством Server.Transfer и что оно не должно вызывать страницу 1 через PreviousPage. Вместо этого он должен теперь получить свои данные из контекста.
Page1.aspx
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack && HttpContext.Items.Contains("CrossPagePostBack") == false)
{
// Cross page postback did not succeed (JavaScript disabled)
string name = NameTextBox.Text;
HttpContext.Items.Add("Name", name);
HttpContext.Items.Add("Transfer", true);
Server.Transfer("Page2.aspx");
}
}
Page2.aspx
protected void Page_Load()
{
if(IsPostBack)
{
string name;
if(CrossPagePostBack)
{
// Cross page postback succeeded (JavaScript was enabled)
HttpContext.Items.Add("CrossPagePostBack", true);
name = PreviousPage.NameTextBox.Text;
}
else if (HttpContext.Items.Contains("Transfer"))
{
// We got transferred to from Page1.aspx
name = (string)HttpContext.Items["Name"];
}
// Do something with Page 1's form value(s)
}
}
Или вы можете перевернуть это и позволить странице 2 добавить метку («Страница 2 была здесь») в HttpContext.Items, а затем страница 1 проверит эту метку. Если он присутствует, его не нужно переносить снова (прервать цикл). Я не уверен на 100%, если вызов PreviousPage также приводит к общему контексту запроса.
Page1.aspx
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack && HttpContext.Items.Contains("CrossPagePostBack") == false)
{
// Cross page postback did not succeed (JavaScript disabled)
if(HttpContext.Items.Contains("Transfer"))
{
// We did not yet transfer to Page 2
HttpContext.Items.Add("Transfer", true);
Server.Transfer("Page2.aspx");
}
}
}
Page2.aspx
protected void Page_Load()
{
if(IsPostBack)
{
if(CrossPagePostback)
{
// Cross page postback succeeded (JavaScript enabled)
HttpContext.Items.Add("CrossPagePostBack", true);
}
string name = PreviousPage.NameTextBox.Text;
// Do something with Page 1's form value(s)
}
}
Второй метод проще в реализации, особенно если форма на странице 1 сложная. У вас будет только одно место, где вы читаете форму страницы 1, и вы добавляете только простое логическое значение в HttpContext.Items.