如何在asp:SessionParameter中使用对象的属性

时间:2010-07-20 01:03:40

标签: asp.net sqldatasource

我正在尝试获取asp:SessionParameter的{​​{1}},以便在会话中使用对象的属性 而不是像SelectParameters

那样在会话中使用字符串

属性为Session["CustomerID"]的内容((客户)Session["Customer"]

我不知道这样做的语法,如果你能提供帮助,我真的很感激

谢谢

我的代码:

Session["Customer"]).CustomerID)

我使用的类与任何其他类(但可序列化)类似

<asp:sqldatasource id="SqlDataSource1" runat="server" connectionstring="<%$ ConnectionStrings:DBConnectionString %>" xmlns:asp="#unknown"> SelectCommand="SELECT * FROM getStoreCustomers (@customerID,@week,@day)"
ProviderName="System.Data.SqlClient">
<selectparameters>
<asp:sessionparameter name="customerID" sessionfield="Customer" /> ?????? (what is the syntax to pass the property here?)
<asp:controlparameter controlid="ddWeek" defaultvalue="-1" name="week" propertyname="SelectedValue" /> <asp:controlparameter controlid="ddDay" defaultvalue="-1" name="day" propertyname="SelectedValue" /> </selectparameters>

4 个答案:

答案 0 :(得分:2)

如何从彼得那里找到。

“改为使用常规参数,并在SqlDataSource的Selectingevent中设置值

<asp:Parameter Name="customerID" Type="String" />

在事件处理程序中:

    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        if (Session["Customer"] != null)
        {
           Customer c = (Customer)Session["Customer"];
           e.Command.Parameters[0].Value = c.CustomerID.ToString();           
        }

}

答案 1 :(得分:1)

我理解你在说什么,但我认为参数不够智能,无法获得会话中存储的对象的属性。我认为它必须是原始类型,否则使用an并通过代码显式设置DefaultValue属性:

ds.SelectParameters["ParamName"].DefaultValue = ((Customer)Session["Customer"]).CustomerID;

答案 2 :(得分:0)

您需要处理sqldatasource的OnSelecting事件并在那里添加参数。

答案 3 :(得分:0)

我写了下面的课,让我为我工作:

/// <summary>
/// Allows to access field-values of a object in Session.
/// </summary>
public class SessionObjectParameter : Parameter
{
    public string SessionField { get; set; }
    public string PropertyName { get; set; }

    protected override object Evaluate(HttpContext context, System.Web.UI.Control control)
    {
        if (string.IsNullOrEmpty(SessionField))
            throw new Exception("SessionField must be definied");

        if (string.IsNullOrEmpty(PropertyName))
            throw new Exception("PropertyName must be definied");

        PropertyInfo pi = context.Session[SessionField].GetType().GetProperty(this.PropertyName);
        if (pi == null)
            throw new Exception(string.Format("PropertyName '{0}' is not definied in the object at Session['{1}'].", this.PropertyName, this.SessionField));

        return pi.GetValue(context.Session[SessionField]);
    }
}

有了这个,我可以将它用作SqlDataSource上的一个简单参数:

    <asp:SqlDataSource ID="dsTest" runat="server" ConnectionString='<%$ ConnectionStrings:con %>' SelectCommand="SELECT * FROM Test WHERE ([Field] = @ParValue)">
        <SelectParameters>
            <costum:SessionObjectParameter Name="ParValue" SessionField="MySessionObject" PropertyName="Value" />
    </asp:SqlDataSource>