Разница между "обычной обратной передачей" и "созданием страницы как PreviousPage" - PullRequest
0 голосов
/ 29 апреля 2011

Существует два сценария для страницы веб-форм ASP.net, которые я хотел бы различать: «Обычная обратная передача» и когда страница создается, потому что следующая страница вызвала PreviousPage.

  • IsPostback: true
  • IsCrossPagePostBack, false

и

  • На странице 2 было Server.Transfer("page2.aspx"), а на странице 2 используется PreviousPage, поэтому страница 1 создается виртуально.Для страницы 1:
    • IsPostback равно true
    • IsCrossPagePostBack равно false

Вы можете видеть, что IsPostBack и IsCrossPagePostBack не помогают, потому что они одинаковы в обоих случаях.

Причина, по которой я спрашиваю это:

У меня есть страница 1, которая отправляет данные на страницу 2 через кросспост-постбэк (PostBackUrl="page2.aspx" установлен на стр. 1).Для всех пользователей, у которых включен JavaScript, это работает отлично.

Но я хотел также использовать запасной вариант для пользователей, у которых отключен JavaScript.Для них нажатие кнопки «Отправить» на странице 1 приводит не к странице 2, а к обратной передаче на страницу 1. Теперь страница 1 может обнаружить это и выполнить Server.Transfer("page2.aspx") на странице 2. Проблема заключается в следующем: когда страница 2 используетPreviousPage затем страница 1 создается снова и будет делать Server.Transfer() снова и снова и снова ...

Мой обходной путь для этого состоит в том, чтобы сделать Server.Transfer не в событии Page_Load, а тольков событии Page_PreRender, потому что это событие происходит, только когда это обычная обратная передача, а не когда страница создается как PreviousPage.
Этот обходной путь работает, но он очень грязный.Если бы я мог провести различие между двумя сценариями уже в событии Page_Load, это было бы намного лучше.

Возможно ли это?

1 Ответ

1 голос
/ 10 декабря 2011

Когда вы выполняете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...