我知道我可以在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访问存储在会话内容中的列表?
谢谢,
杰森
答案 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(),这将不会吐出任何可以使用的内容。