我有一个会话变量,它保存当前登录用户的详细信息。我想基于变量运行查询并将其显示在网格视图中。 我想用会话变量替换网格视图的默认值,但这不起作用。
有人能指出我正确的方向吗?
这就是我的尝试:
<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>
答案 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();
}
}
只需确保,只有在流程中先前分配/创建后才能访问变量。