ASP - передача значения по сеансу с одной страницы на другую [дубликат]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

6
задан Cristian Ciupitu 3 August 2014 в 15:57
поделиться

7 ответов

Вы говорите, что вы установили PostBackUrl на свою вторую страницу. Если вы собираетесь это сделать, вам нужно использовать Page.PreviousPage, чтобы получить доступ к вашему текстовому полю. Но это самый простой способ:

Во-первых, оставьте PostBackUrl в покое. Установка PostBackUrl на вторую страницу означает, что вы говорите SECOND PAGE, чтобы обращаться с кнопкой, а не на первой странице. Следовательно, ваша переменная сеанса никогда не будет установлена ​​и будет равна нулю, когда вы попытаетесь вытащить ее.

Это должно работать для ya.

И да, вы также можете сделать это с помощью QueryString , но если это то, что вы не хотите, чтобы пользователь видел / редактировал, тогда лучше использовать переменную сеанса.

 protected void submit_Click(object sender, EventArgs e)
 {
      string name = txtFirstName.Text.Trim();
      Session["name"] = name;
      Response.Redirect("PageTwo.aspx");
 }

Затем на второй странице (вам НЕ нужна ТОСТРЯ )):

 protected void Page_Load(object sender, EventArgs e)
 {
      if (Session["name"] != null)
      {
           lblName.Text = Session["name"].ToString();
      }
 }

РЕДАКТИРОВАТЬ - Убедитесь, что нажатие кнопки на самом деле активируется. Кто-то может исправить меня неправильно, так как большую часть своей работы я делаю на VB.NET, а не на C #. Но если вы не укажете значение OnClick, ваша функция не будет вызвана.

 <asp:Button ID="Button1" runat="server" Text="Click Me!" OnClick="submit_Click" />
6
ответ дан dotnetcanuck 26 August 2018 в 12:16
поделиться

Вы можете использовать Server.Transfer() вместо Response.Redirect()

0
ответ дан Chewpers 26 August 2018 в 12:16
поделиться

Выполняете ли вы переадресацию после установки переменной сеанса на первой странице, если это вам не удастся (если вы не знаете трюк). Оформить заказ в этой статье , чтобы он работал. В принципе, способ выполнения этой работы - это метод перенаправления перегрузки.

Response.Redirect("~/newpage.aspx", false);

Параметр false предотвращает .net от завершения обработки на существующей странице (которая фактически записывает состояние сеанса)

0
ответ дан Gary Walker 26 August 2018 в 12:16
поделиться

Не думаю, что вы добавили сессию. Так я и сделал.

Первая страница

protected void btnView_Click(object sender, EventArgs e)
        {
            foreach (ListItem li in lbxCheckDates.Items)
            {
                if (li.Selected == true)
                {
                    lblMessage.Text = "";
                    string checkDate = lbxCheckDates.SelectedItem.Text;
                    Session.Add("CheckDates", checkDate);
                    Page.ClientScript.RegisterStartupScript(
                    this.GetType(), "OpenWindow", "window.open('Paystub.aspx','_newtab');", true);
                }
            }
        }

Вторая страница

protected void Page_Load(object sender, EventArgs e)
       {
            string checkDate = (string)(Session["CheckDates"]);

            //I use checkDate in sql to populate a report viewer
        }

Итак, с вашей, я думаю, вам нужно ..

protected void submit_Click(object sender, EventArgs e)
    {
        string name = txtFirstName.Text.Trim();
        Session.Add("Name", name);
    }

Я думаю, что то, что у вас есть на второй странице, должно работать, но если это не так, добавьте ToString () к нему, как ..

lblName.Text = (string)(Session["name"]).ToString();

Дайте мне знать, если это поможет!

0
ответ дан Humpy 26 August 2018 в 12:16
поделиться

Для первой страницы используйте это:

protected void Button1_Click(object sender, EventArgs e)
{
    string value = TextBox1.Text;
    Session["value"] = value;
    Response.Redirect("~/Sessionpage.aspx");
}
-2
ответ дан João Mendes 26 August 2018 в 12:16
поделиться

Для второй страницы

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["value"] != null)
    {
        Label1.Text = Session["value"].ToString();

    }
    else 
    {
        Label1.Text = "Sorry,Please enter the value  ";
    }
}
0
ответ дан mattmanser 26 August 2018 в 12:16
поделиться

Код, который вы опубликовали, выглядит хорошо, поэтому ваша проблема, вероятно, связана с настройкой.

Проверьте эту ссылку Обзор состояния сеанса ASP.NET и обратите особое внимание на разделы, посвященные Cookieless SessionIDs и Настройка состояния сеанса .

0
ответ дан slugster 26 August 2018 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: