2016-10-05 79 views
0

我有一個aspx頁面,它顯示了一個等待審查的問題的網格視圖,每頁顯示10個問題。如果選擇了某個問題,則會在新頁面中打開,審閱者可以提交審閱或取消並返回到需要審閱的問題列表。會話變量不被看到/使用

目前這工作正常,但有審閱者的要求,所以如果他們在網頁視圖的第4頁,當他們去問一個問題,他們會返回到第4頁,如果他們擊中取消並返回到列表問題(目前他們返回到第1頁)。

因此,我設置了幾個會話變量來捕獲所選問題並捕獲gridview控件的pageindex以供將來使用。嘗試在詳細信息頁面的頁面加載上使用會話變量作爲questionId,但它未被傳遞。在返回到評論列表頁面時,在gridview上設置的頁面索引始終爲0,而​​不是會話變量。

更新GridView控件(注意兩個控件,一個超鏈接(這應該走開一旦對方LinkBut​​ton控件作品):

<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") +"&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應使用會話變量來設置網格控件的頁面ReviewList頁面上具有約束力,但總是會默認頁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(); 

    } 
+0

您應該在您的瀏覽器中打開開發人員控制檯,並觀察您的重定向的響應標題中的真實位置..我確信它會幫助您。 –

+0

當我在firefox中運行調試器時,我單擊該按鈕時返回的所有內容爲:__doPostBack('ctl00 $ MainContent $ GridView1 $ ctl02 $ Details2','')不知道應該告訴我什麼。 –

+0

當你看到你的重定向的響應標題,你會看到你重定向到什麼網址,並且可能會看到querystring中的「Id」參數有什麼問題(格式錯誤,爲空)。不要看javascript控制檯,你必須看看網絡標籤(這是它的鉻,我不使用FF),看看如何rosponse看起來像。 –

回答

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; 
       } 
      } 
     } 
    } 

爲什麼要在第一個按鈕上做回發?這是不需要只是重定向到不同的網址。將其更改爲:

<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") + "&Page=" + GridView2.PageIndex %>'>View Question</asp:HyperLink> 

UPDATE

如果你真的想做一回發到設定的會話,你可以使用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"])); 
     } 
    } 
+0

謝謝,更改爲超鏈接並將pageindex添加到行中有助於在移至詳細記錄時保存pageindex。現在我遇到了一個問題,當返回到列表頁面時,pageindex未被拾取。也許另一個問題,如果我不能整理出來。 –

+0

其實並沒有明白這一點。將第一個按鈕更改爲超鏈接工作,,,但它之前工作。我仍然沒有接近獲取會設置爲第二個按鈕不起作用的會話變量。由於我無法撤銷我接受的答案,我猜我必須再次重新提交問題:( –

+0

已更新的問題與新版本,,,非會話變量似乎被拿起並在任何地方使用?? –