Доступ к переменным сеанса ASP с помощью Javascript - PullRequest
4 голосов
/ 09 августа 2011

Я знаю, что могу ссылаться на простую переменную сеанса (то есть: строку) в JavaScript следующим образом:

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

Но проблема в том, что у меня есть объект общего списка ASP.NET, хранящийся в Session.Contents. Объект выглядит так:

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

Ответы [ 5 ]

3 голосов
/ 09 августа 2011

Проблема в том, что тег привязки оценки автоматически вызывает метод ToString () для всего, что он находит в объекте Session.

Итак, если:

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

имеет значимую реализацию (например, это строка или тип значения), тогда вы получите то, что ожидаете.

Однако в вашем примере вы храните экземпляр класса LetterReason, для которого вызов виртуального метода object ToString () по умолчанию вернет имя класса.

Ответ зависит от того, что вы хотите сделать с результатом. Вы не можете тривиально использовать объект .NET в JavaScript, данные проходят через границу домена (то есть за пределы вашего сайта .NET и через сеть, а затем в DOM HTML-страницы).

Вам нужно каким-то образом сериализовать его, возможно, JSON. Используйте такой подход: Можете ли вы создать экземпляр объекта из JSON в .NET?

Это если вам нужно все богатство класса. Если вы просто ищете конкретные свойства / методы, вы можете получить:

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

Итак, здесь вам нужно привести ваш экземпляр сеанса к вашему конкретному классу (обычные .net System.Object хранятся в сеансах, что дает вам максимальную гибкость), а затем взять желаемое свойство.

Однако сериализация объекта из .NET в JSON будет гораздо лучшим решением, поскольку она гибкая и поддерживаемая.

1 голос
/ 09 августа 2011

Обычно я обрабатываю соединения клиент / сервер (например, обращаюсь к состоянию на сервере) асинхронно, используя комбинацию WebServices и JQuery. Этот шаблон имеет очень небольшую полезную нагрузку по сравнению со встроенным инструментарием AJAX asp.net и отлично справится с вашим сценарием.

Эта статья является отличным примером для начала: http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

0 голосов
/ 09 августа 2011

Вам нужно будет сериализовать этот список в XML, JSON или что-то с разбором. Выгрузка сложного сеанса var на страницу, как в вашем примере, в основном выполняет ToString () для экземпляра списка, который не выдаст ничего, что вы можете использовать.

0 голосов
/ 09 августа 2011

Попробуйте 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);
0 голосов
/ 09 августа 2011

Вы не можете получить доступ к своему списку таким образом, потому что объект, который вы храните в Session, специфичен для .NET, и JavaScript не знает, что это такое и как его анализировать.Вам необходимо преобразовать массив во что-то более понятное, например строку с разделителями или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...