使用Javascript访问ASP会话变量

时间:2011-08-09 16:08:00

标签: javascript asp.net list session variables

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

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

但我遇到的问题是我有一个存储在Session.Contents中的ASP.NET通用列表对象。该对象如下所示:

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访问存储在会话内容中的列表?

谢谢,

杰森

5 个答案:

答案 0 :(得分:3)

问题是评估绑定标记会自动调用它在Session对象中找到的任何内容的ToString()方法。

所以,如果:

var SesVar = '<%= Session("MySessionVariable").ToString() %>';

有一个有意义的实现(例如,它是一个字符串,或一个值类型),然后你会得到你期望的。

但是,在您的示例中,您正在存储类的实例LetterReason,默认的object ToString()虚方法调用将返回该类的名称。

答案取决于您想要对结果做什么。你不能在JavaScript中轻易使用.NET对象,数据是通过域边界(即从.NET网站和网络进入,然后进入HTML页面的DOM)。

您需要以某种方式对其进行序列化,可能是JSON。使用这样的方法:Can you Instantiate an Object Instance from JSON in .NET?

如果您需要课程的所有丰富性,那就是这样。如果您只是寻找特定的属性/方法,您可以:

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

所以,在这里你需要将你的会话实例转换为你的特定类(普通.net System.Object存储在Sessions中,为你提供最大的灵活性),然后获取你想要的属性。

然而,将对象从.NET序列化为JSON将是最佳解决方案,因为它具有灵活性和可维护性。

答案 1 :(得分:1)

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

本文是一个很好的入门示例:http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

答案 2 :(得分:0)

您无法以这种方式访问​​列表,因为您在Session中存储的对象特定于.NET,而JavaScript不知道它是什么或如何解析它。您需要将数组转换为更普遍理解的内容,例如分隔字符串或其他内容。

答案 3 :(得分:0)

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

然后,在客户端,使用ASP.NET的客户端库进行反序列化:

Sys.Serialization.JavaScriptSerializer.deserialize(mySessionVarString, false);

答案 4 :(得分:0)

您需要将该列表序列化为XML或JSON或可解析的内容。将复杂的会话var转储到类似于示例的页面上基本上是在列表实例上执行ToString(),这将不会吐出任何可以使用的内容。