Редирект без обратной публикации

У меня есть форма регистрации пользователя. Здесь у меня есть ссылка на другую страницу (страницу информации о карте), которую необходимо заполнить для регистрации. Пользователь заполняет несколько полей в форме регистрации пользователя и нажимает на ссылку, которая ведет на страницу информации о карте. Когда пользователь щелкает ссылку на странице информации о карте, чтобы вернуться на страницу регистрации, предыдущие данные, введенные при регистрации, исчезают. Поэтому мне нужно перенаправить со страницы информации о карте на страницу регистрации без обратной передачи. Как я могу это сделать?

Response.Redirect() используется для перенаправления.


person Gopi    schedule 06.07.2010    source источник


Ответы (6)


Я не думаю, что вы можете сделать это без обратной передачи. Я бы рекомендовал хранить данные с вашей страницы регистрации в состоянии сеанса, а затем, если пользователь вернется на эту страницу, повторно заполнить поля из состояния сеанса.

//eg in registration page
protected void CardInfoLink_Click(object sender, EventArgs e)
{
    //store details entered
    Session["Registered"] = true;
    Session["Username"] = txtUserName.Text; 
    //etc for any other fields
    Response.Redirect("~/CardDetailsPage.aspx");
}

то в методе Page_Load вы можете, если данные сеанса существуют, предварительно заполнить форму из сеанса. например

if (!Page.IsPostback && (bool)Session["Registered"])
{
    txtUserName.Text = (string)Session["Username"];
    //repopulate other fields as necessary
}
person Matthew Dresser    schedule 06.07.2010
comment
Да, я знаю, что сессию можно использовать, но я думал, есть ли другой способ! У меня больше полей (30) на странице регистрации пользователя - person Gopi; 06.07.2010
comment
Я до сих пор не думаю, что есть какой-либо другой способ обойти это, кроме как хранить информацию о форме на стороне сервера, будь то в сеансе или базе данных, или хранить их в файлах cookie (что, я думаю, по-прежнему требует код на стороне сервера). Чтобы упростить задачу, вы можете создать простой класс со свойствами get/set для представления всех ваших полей формы, а затем сохранить экземпляр этого класса в состоянии сеанса, что было бы немного более управляемым. Дайте мне знать, если вам нужен пример того, что я имею в виду. - person Matthew Dresser; 06.07.2010
comment
Спасибо..! Сделал то же самое после просмотра ответов :) - person Gopi; 06.07.2010

Когда вы перенаправляете на другую страницу, он теряет весь контекст этой первой страницы, если вы не сделаете что-то, чтобы остановить это. Варианты, которые приходят на ум:

  1. Создайте страницу информации о карте во всплывающем окне. Это будет означать, что ваше главное окно не изменилось в фоновом режиме. Вы бы предпочли использовать для этого чисто клиентский код, но если вам нужен код на стороне сервера, это все еще возможно, просто немного сложнее.

  2. Сохраняйте информацию о постбэке перед редиректом. Это может быть либо просто в сеансе, либо в базе данных, или вы даже можете сделать это на стороне клиента в файлах cookie, если хотите. Затем, когда вы снова посещаете страницу, вы можете проверить, сохранили ли вы информацию, и загрузить ее автоматически.

person Chris    schedule 06.07.2010

Если вы перенаправите пользователя на другую страницу, вся захваченная информация на этом экране будет потеряна. Состояние просмотра сохраняется не при редиректах, а только при постбэках/обратных вызовах

Единственный способ сохранить информацию при перенаправлении — это использовать переменные сеанса, файлы cookie или даже сохранить данные в файле базы данных/XML и повторно заполнить их при возврате на эту страницу.

Я бы посоветовал вам сохранить свою информацию, когда пользователь будет направлен на информационную карту, а затем по возвращении проверить значения и повторно заполнить ее.

person stoic    schedule 06.07.2010

Вы можете сохранить значения в ViewState/Session и перенаправить на другую страницу (страницу информации о карте), а затем повторно заполнить значения при возврате на страницу регистрации. Или показывая pop-ups или panels (показать/скрыть с помощью свойства Visible) на той же странице, вы можете сохранить пользовательский ввод. (Если вы используете элементы управления на стороне сервера, значения не очищаются).

person SelvaS    schedule 06.07.2010

Server.Transfer() выполнит переход на другую страницу на стороне сервера.

Обновление: можно было бы заполнить свойство Context.Items текущей страницы состоянием, изначально переданным строкой запроса. Это похоже на состояние сеанса, но ограничено текущим запросом.

Обновление 2: метод Server.Transfer() имеет перегрузку, которая принимает логический параметр preserveForm, что сохраняет параметры строки запроса:

http://msdn.microsoft.com/en-us/library/aa332847(v=VS.71).aspx

person Adam Houldsworth    schedule 06.07.2010
comment
Server.Transfer не будет работать в этом отношении, так как пользователь использует информационные карты, для которых требуются параметры строки запроса. - person stoic; 06.07.2010
comment
Неважно, небольшое дальнейшее чтение, кажется, предполагает, что он может сохранить строку запроса, если вы этого хотите. - person Adam Houldsworth; 06.07.2010

Вы можете использовать любой запрос ajax при нажатии кнопки «перейти на следующую страницу», чтобы скопировать регистрационные данные в сеанс. Затем после возврата вы можете снова заполнить данные и удалить сеанс. Ваш код должен быть похож на этот:

----------------jquery ajax-запрос--------------------------------------

function SetValuesIntoSession(value1, value2, value3) {        
        $.ajax(
        {
            type: "POST",
            url: WebServicePathAndName.asmx/InsertIntoSessionMethodName",
            contentType: "application/json; charset=utf-8",
            data: "{value1:'" + value1 + "', value2:'" + value2 + "', value3:'" + value3 + "'}",
            dataType: "json",
            success: function(response) {
                if (response.d == "Yes") {
                    //do something in correct response
                }
                if (response.d == "No") {
                    //do something for incorrect response
                }
            },
            error: function(xhr) {
                alert('Error!  Status = ' + xhr.status);
            }
        });       
}

ниже приведен код веб-службы, которая должна вставлять данные в сеанс. Обратите внимание, что вы должны установить «EnableSession = true», если хотите использовать состояние сеанса в своем веб-сервисе.

---------------------WebServicePathAndName.asmx------------------

[WebMethod( EnableSession = true )] 
public void InsertIntoSessionMethodName( string value1, string value2, string value3 )
{

    Session[ "value1" ] = value1;
    Session[ "value2" ] = value2;
    Session[ "value2" ] = value3;
}

Я думаю, что остальной код должен быть легко реализован.

person Ivan Stefanov    schedule 06.07.2010