使用Javascript访问ASP会话变量
我知道我可以在javascript中引用一个简单的会话变量(即:string),如下所示:使用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
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.netSystem.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() %>';