在ASP.Net Gridview中使用会话变量

时间:2013-07-25 21:36:55

标签: c# asp.net

我有一个会话变量,它保存当前登录用户的详细信息。我想基于变量运行查询并将其显示在网格视图中。 我想用会话变量替换网格视图的默认值,但这不起作用。

有人能指出我正确的方向吗?

这就是我的尝试:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:..... %>" 

    SelectCommand="SELECT [Username], [Password], [CustomerName], [CustomerAddress], [Contact] FROM [Customers] WHERE ([Username] = @Username)">
    <SelectParameters>
        <asp:Parameter DefaultValue="session[new]" Name="Username" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

3 个答案:

答案 0 :(得分:3)

您可以在SqlDataSource使用数据源的Selecting事件执行Query之前提供Session变量值。使用OnSelecting属性在Markup中设置此事件。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:..... %>" 
    OnSelecting="SqlDataSource1_Selecting"
    SelectCommand="SELECT [Username], [Password], [CustomerName], [CustomerAddress], [Contact] FROM [Customers] WHERE ([Username] = @Username)">
    <SelectParameters>
        <asp:Parameter Name="Username" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

在选择事件处理程序中,执行以下操作:

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
    { 
          if(Session["UserName"]!=null)
           {
           // do this only when Session Variable stores as a string the Username
           e.Command.Parameters["@Username"].Value = Session["UserName"];
           }
         else
           {
              // assign the default value if session variable is Null
              e.Command.Parameters["@Username"].Value ="DefaultValue";
            }

    }

在此事件处理程序中,您可以访问将要执行的命令 SqlDataSourceSelectingEventArgs.Command属性,并以编程方式修改其参数值。

答案 1 :(得分:3)

我最终做的与FlopScientist的回答类似。我发现DataSource实际上有一个选项可以选择我在设计视图中做过的会话变量,它有以下代码:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:..... %>" 

SelectCommand="SELECT [Password], [CustomerName], [CustomerAddress], [Contact], [Username] FROM [Customers] WHERE ([Username] = @Username)">



<SelectParameters>
            <asp:SessionParameter Name="Username" SessionField="mySessionVariable" Type="String" />


</SelectParameters>
</asp:SqlDataSource>

答案 2 :(得分:0)

Session中的

ASP.NET对象是服务器端状态维护变量之一。

您可以找到更多here

会话变量只存储您为其分配的任何值。简而言之,您可以在任何其他页面上访问此变量,即使您在其他页面上创建了该变量。

所以假设page1.aspx你做了:

  Session["uniqueName"] = GetGridViewData(); //you can store anything.

其中GetGridViewData()的签名如下:

public DataTable GetGridViewData();

然后在page2.aspx(或任何其他页面)上,您可以执行此操作:

protected void Page_Load(object sender, EventArgs e)
{
   if(Session["uniqueName"]!=null)
   {
      //typecast it to your datastructure or whatever you assigned into it
      DataTable gridDataSource = (DataTable)Session["uniqueName"];

      //any custom logic you want to perform on gridDataSource
      gridView1.DataSource = gridDataSource;
      gridView.DataBind();
   }
}

只需确保,只有在流程中先前分配/创建后才能访问变量。