会话变量未被查看/使用

时间:2016-10-05 18:52:11

标签: c# asp.net

我有一个aspx页面,显示等待审核的问题的网格视图,每页显示10个问题。如果选择了一个问题,则会在新页面中打开,审阅者可以提交评论或取消评论,然后返回需要审核的问题列表。

目前此工作正常,但有审稿人的请求,以便如果他们在访问问题时在gridview的第4页上,如果他们点击取消并返回到问题列表,他们将返回到第4页(目前他们将返回第1页)。

所以我设置了几个会话变量来捕获所选的问题并捕获gridview控件的pageindex以供将来使用。尝试在详细信息页面的页面加载上使用sessionId的会话变量,但它没有被传递。返回Review List页面时,gridview上设置的pageindex始终为0,而​​不是会话变量。

更新了Gridview控件(注意两个控件,一个超链接(一旦另一个linkbutton控件工作就应该消失):

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

    }

第二个按钮的OnClick事件:

 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();

详细信息页面上的连接字符串,现在没有获取参数“QuestionID”的值; ):

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();

   }

ReviewList页面上的PageLoad和gridview绑定应该使用会话变量来设置网格控件的页面,但总是默认为第0页:

{{1}}

1 个答案:

答案 0 :(得分:0)

您的错误可能意味着Request["Id"]为空或不存在。始终检查QueryStrings是否存在,并在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>

或者还有QueryString中的Page Index:

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

<强>更新

如果你真的想要一个PostBack来设置Sessions,你可以使用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"]));
        }
    }