Переменные сеанса не видны / не используются

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть страница aspx, на которой отображается сетка вопросов, ожидающих рассмотрения, с 10 вопросами, отображаемыми на странице. Если вопрос выбран, он открывается на новой странице, где рецензент может либо отправить отзыв, либо отменить и вернуться к списку вопросов, требующих проверки.

В настоящее время это работает нормально, но у рецензентов есть запрос, чтобы, если они находятся на странице 4 gridview, когда они переходят к вопросу, они возвращаются на страницу 4, если они нажимают «Отмена» и возвращаются к списку вопросов (в настоящее время они возвращаются на страницу 1).

Итак, я устанавливаю пару переменных сеанса для захвата выбранного вопроса и для захвата pageindex элемента управления gridview для дальнейшего использования. Пытаюсь использовать переменную сеанса для QuestionID при загрузке страницы на странице сведений, но она не передается. При возвращении на страницу списка просмотра pageindex, который устанавливается в gridview, всегда равен 0, а не переменной сеанса.

Обновленный элемент управления Gridview (обратите внимание на два элемента управления, одну гиперссылку (которая должна исчезнуть, как только заработает другой элемент управления linkbutton):

  <asp:GridView ID="GridView1" runat="server" Caption="Questions Awaiting Review" AllowSorting="True" PagerSettings-Mode="NumericFirstLast" OnPageIndexChanging="GridView1_PageIndexChanging"
CaptionAlign="Top" EmptyDataText="No Questions Pending Review." PageSize="10" AllowPaging="true" PagerStyle-HorizontalAlign="Center" PagerStyle-Font-Size="Large" DataKeyNames="QuestionID"
AutoGenerateColumns="false" AlternatingRowStyle-BackColor="#cccccc">
<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <asp:Label ID="QuestionID" runat="server" Text='<%# Eval("QuestionID") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="KeyObjective" HeaderText="Key Objective" ItemStyle-Width="250" />
    <asp:BoundField DataField="SubmitDate" HeaderText="Submitted Date" ItemStyle-Width="60" />
    <asp:TemplateField>
        <ItemTemplate>
            <asp:HyperLink ID="Details" runat="server" NavigateUrl='<%#"~/Review/ReviewDetail.aspx?Id="   Eval("QuestionID")  "amp;PageIndex="   GridView1.PageIndex %>'>View Question</asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="Details2" runat="server" Text="Session" OnClick="Session_OnClick"></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
</Columns>

</asp:GridView>
  

Событие OnClick для второй кнопки:

 protected void Session_OnClick(object sender, EventArgs e)
    {
        Session["PageIndex"] = GridView1.PageIndex;
        Session["QuestionId"] = GridView1.SelectedDataKey;
        Response.Redirect("~/Review/ReviewDetail.aspx", false;

    }
  

Строка подключения на странице сведений, которая теперь не получает значение для параметра «QuestionID»; ):

  SqlCommand command = new SqlCommand("QuestionDetail", Conn);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add(new SqlParameter("@QuestionID", SqlDbType.BigInt));

            command.Parameters["@QuestionID"].Value = Convert.ToInt64(Session["QuestionId"]);
            Conn.Open();
            SqlDataReader reader = command.ExecuteReader();
  

Привязка PageLoad и gridview на странице списка отзывов, которая должна использовать переменную сеанса для установки страницы управления сеткой, но всегда будет иметь значение по умолчанию для страницы 0:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
                bindGridView();
        }
        else
        {
            if (Convert.ToInt32(Session["PageIndex"]) !=0)
            {
                GridView1.PageIndex = Convert.ToInt32(Session["PageIndex"]);
                bindGridView();
            }
        }
    }
   private void bindGridView()
   {
            string connectionString = WebConfigurationManager.ConnectionStrings["CS1"].ConnectionString;
            string selectSQL = String.Format("Select QuestionID, KeyObjective, SubmitDate from Questions where Author <> '{0}' and QuestionID not in(Select QuestionID from Review where Reviewer = '{0}')", User.Identity.Name);
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(selectSQL, con);
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();

            adapter.Fill(ds, "Review");

            GridView1.DataSource = ds;
            GridView1.DataBind();

   }
  

Комментарии:

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

2. когда я запускаю отладчик в firefox, все, что я получаю обратно, когда нажимаю эту кнопку: __doPostBack(‘ctl00 $MainContent $ GridView1 $ ctl02 $ Details2’,») Понятия не имею, что это должно мне говорить.

3. Когда вы просматриваете заголовки ответа вашего перенаправления, вы увидите, на какой URL-адрес вы перенаправлены, и, вероятно, увидите, в чем проблема с этим параметром «Id» в строке запроса (неправильный формат, пустой ..). Не смотрите на консоль javascript, вам нужно посмотреть вкладку network (этокак это называется в Chrome, я не использую FF) и посмотрите, как выглядит rosponse.

Ответ №1:

Ваша ошибка, вероятно, означает, что Request["Id"] она пуста или не существует. Всегда проверяйте, существуют ли строки запросов, и выполняйте преобразования пользовательских вводов, которые могут привести к сбою внутри блока try-catch.

     protected void Page_Load(object sender, EventArgs e)
    {
        long QuestionID = -1;

        //check if the Id QueryString exists
        if (Request.QueryString["Id"] != null)
        {
            //try to convert to int64
            try
            {
                QuestionID = Convert.ToInt64(Request.QueryString["Id"]);
            }
            catch
            {
            }
        }

        //if valid QuestionID
        if (QuestionID >= 0)
        {
            using (SqlConnection connection = new SqlConnection(Common.connectionString))
            using (SqlCommand command = new SqlCommand("QuestionDetail", connection))
            {
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.Add("@QuestionID", SqlDbType.BigInt).Value = QuestionID;

                //try to execute the stored procedure
                try
                {
                    connection.Open();
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    //handle sql error
                    Literal1.Text = ex.Message;
                }
            }
        }
    }
  

И почему вы делаете обратную передачу по первой кнопке? Это не нужно просто для перенаправления на другой URL. Измените его на:

 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%#"~/Review/ReviewDetail.aspx?Id="   Eval("QuestionID") %>'>View Question</asp:HyperLink>
  

Или с индексом страницы также в строке запроса:

 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%#"~/Review/ReviewDetail.aspx?Id="   Eval("QuestionID")   "amp;Page="   GridView2.PageIndex %>'>View Question</asp:HyperLink>
  

Обновить

Если вы действительно хотите выполнить обратную передачу для установки сеансов, вы можете использовать OnRowCommand:

 <asp:LinkButton ID="LinkButton1" CommandArgument='<%# Eval("QuestionID") %>' runat="server" CommandName="viewQuestion">View Question</asp:LinkButton>
  

CS

     protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "viewQuestion")
        {
            Session["PageIndex"] = GridView1.PageIndex;
            Session["QuestionId"] = e.CommandArgument.ToString();
            Response.Redirect("~/Review/ReviewDetail.aspx?Id="   Convert.ToString(Session["QuestionId"]));
        }
    }
  

Комментарии:

1. Спасибо, изменение на гиперссылку и добавление pageindex в строку помогли сохранить pageindex при переходе к подробной записи. Теперь у меня возникла проблема с тем, что pageindex не отображается при возврате на страницу списка. Может быть, еще один вопрос, если я не могу разобраться.

2. На самом деле не понял ничего из этого. Изменение первой кнопки на гиперссылку работает,,, но это работало раньше. Я все еще не приблизился к получению переменной сеанса, которую я настраиваю на работу, поскольку вторая кнопка не работает. Поскольку я не могу отменить свое согласие с ответом, думаю, мне придется снова отправить вопрос: (

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

4. Обновил мой ответ. В моем примере теперь есть ссылка в GridView, которая выполняет обратную отправку, которая отправляет QuestionID.

5. Введите изменения, все, что делает кнопка, это перезагрузить страницу списка отзывов.