使用Javascript访问ASP会话变量

使用Javascript访问ASP会话变量,javascript,asp.net,list,session,variables,Javascript,Asp.net,List,Session,Variables,我知道我可以在javascript中引用一个简单的会话变量(即:string),如下所示: var SesVar = '<%= Session("MySessionVariable") %>'; alert(SesVar); Public Class LetterReason Private _reasonCode As String Public Property ReasonCode() As String Get Return _reasonCode

我知道我可以在javascript中引用一个简单的会话变量(即:string),如下所示:

var SesVar = '<%= Session("MySessionVariable") %>';
alert(SesVar);
Public Class LetterReason

Private _reasonCode As String
Public Property ReasonCode() As String
    Get
        Return _reasonCode
    End Get
    Set(ByVal value As String)
        _reasonCode = value
    End Set
End Property

Private _reason As String
Public Property Reason() As String
    Get
        Return _reason
    End Get
    Set(ByVal value As String)
        _reason = value
    End Set
End Property
我在会话内容中存储了此对象的列表,如下所示:

Dim lsReasons As New List(Of LetterReason)

lsReasons = MyWCF.Get(reasons)

Session.Contents("lsReasons") = lsReasons    
问题是,当我使用上面的代码(SesVar)时,它返回以下内容:

System.Collections.Generic.List`1[LetterWriterASP2.ServiceReference1.LetterReason]
有没有办法通过javascript访问存储在会话内容中的列表

谢谢


Jason

您无法通过这种方式访问列表,因为您在会话中存储的对象是特定于.NET的,JavaScript不知道它是什么,也不知道如何解析它。您需要将数组转换为更普遍理解的格式,如分隔字符串或沿这些行的格式。

尝试JSON序列化该值-我编写了一个助手方法:

public static string JsonSerialize<T>(T tItem)
{
    if (null == Attribute.GetCustomAttribute(typeof(T), typeof(DataContractAttribute)))
    {
        bool canSerialize = false;
        if (typeof(T).IsGenericType)
        {
            foreach (Type t in typeof(T).GetGenericArguments())
            {
                if (t.IsPrimitive)
                {
                    canSerialize = true;
                }
                else if (!(null == Attribute.GetCustomAttribute(t, typeof(DataContractAttribute))))
                {
                    canSerialize = true;
                }
                else
                {
                    canSerialize = false;
                    break;
                }
            }
        }

        if (canSerialize == false)
        {
            throw new SerializationException(String.Format("Cannot JsonSerialize instance of type {0} because {0} is not decorated as a DataContract.", typeof(T).FullName));
        }
    }

    string sResult = String.Empty;
    try
    {
        DataContractJsonSerializer jsonSerializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
        using (MemoryStream ms = new MemoryStream())
        {
            jsonSerializer.WriteObject(ms, tItem);
            sResult = System.Text.Encoding.Default.GetString(ms.ToArray());
        }
    }
    catch
    {
        throw;
    }
    return sResult;
}

问题是求值绑定标记将自动调用在
会话
对象中找到的ToString()方法

因此,如果:

var SesVar = '<%= Session("MySessionVariable").ToString() %>';
因此,这里您需要将会话实例强制转换为特定的类(plain.net
System.Object
存储在会话中,为您提供最大的灵活性),然后获取所需的属性


但是,将对象从.NET序列化为JSON将是最好的解决方案,因为它灵活且可维护。

通常我使用WebService和JQuery的组合异步处理客户机/服务器通信(例如访问服务器上的状态)。与内置的asp.net AJAX工具包相比,此模式的负载非常小,可以很好地处理您的场景


本文是一个很好的入门示例:

您需要将该列表序列化为XML、JSON或其他可解析的格式。将一个复杂的会话变量转储到一个页面上(如示例中所示),基本上就是在列表实例上执行一个ToString(),这将不会输出任何您可以使用的内容

var SesVar = '<%= Session("MySessionVariable").ToString() %>';
var reasonCode = '<%= ((LetterReason)Session("MySessionVariable")).ReasonCode() %>';
var reason = '<%= ((LetterReason)Session("MySessionVariable")).Reason() %>';