2015-02-11 3 views
4

Я пытаюсь выяснить лучший способ передачи данных сеанса сервера из приложения MVC Razor в Angularjs.Как пройти сеанс сервера от Razor MVC C# до Angularjs?

В ASP.net нам удалось расширить класс, используя System.Web.UI.Page, создать элемент словаря строки и json сериализовать эти данные, а затем передать этот элемент этому .ClientScript.RegisterClientScriptBlock, но я не могу следовать тот же путь, потому что я использую Razor.

В настоящее время я просто передаю ViewBag.variableName и задаю значение в ng-init, но это не идеально. Итак, несколько идей, которые я придумал.

Было бы лучше настроить угловую службу, которая извлекает страницу обработчика ashx, которая ставит сеанс в $ scope.variable с помощью углового контроллера? Или пройти сеанс до представления, а затем каким-то образом получить его в $ scope?

Каков наилучший способ получения переменных сеанса сервера в угловое от MVC Razor?

Хорошо, я разместил свой нижний ответ, но мне все еще не удается получить сеанс в объеме моих нескольких контроллеров. Поскольку http.get является асинхронным, и я не могу получить, чтобы результаты были динамическими.

+1

Пример типа данных сеанса, который вы хотите передать, был бы полезен. Выявление партии никогда не является хорошей идеей (риск безопасности). Простые значения могут быть введены в элементы страницы, как вы это делали. Более сложные данные могут (не рекомендуется) вводиться как объекты буква JS. Все зависит от того, что вы хотите сделать. –

+0

Так будет ли создание массива сеанса специально для перехода в угловую лучшую идею? – Demodave

+0

Какие данные вы хотите от сеанса на странице? Можете ли вы привести пример, чтобы мой плохой уставший мозг мог его пережевывать? :) –

ответ

0

Итак, вот круглый путь, в котором я это сделал. Я просто не знаю, является ли это лучшей практикой или нет. Исходя из комментариев, я указываю, какие элементы сеанса я хочу отправить в угловой.

1) Я создал уникальный словарь, который собирается передать данные моей сессии переменной

private Dictionary<string, List<string>> _sessionDict 
    = new Dictionary<string, List<string>>(); 

2) Я создал (Fn), чтобы ускорить процесс вставки

public static void addDictionarySession(
    Dictionary<string, List<string>> sessionDict, string key, string value) 
{ 
    List<string> stringValue = new List<string>() { value };  
    sessionDict.Add(key, stringValue); 
} 

3) Я вставил данные в мой словарь

utility.addDictionarySession(_sessionDict, "test", "This is a test"); 

4) Я добавил словарь сессии

Session.Add("jsPass", _sessionDict); 

5) Я создал страницу обработчика ASHX, чтобы получить переменные сессии здесь моя функция

private void getSessionVariables() 
{ 
    Dictionary<string, string> sessionData = new Dictionary<string, string>(); 

    // Retrieve Session that is stored in dictionary 
    Dictionary<string, List<string>> sessionDict = 
    _context.Session["jsPass"] as Dictionary<string, List<string>>; 

    if (sessionDict != null) 
    { 
    foreach (KeyValuePair<string, List<string>> entry in sessionDict) 
    { 
     // Set the Value of the item 
     foreach (string value in entry.Value) 
     { 
     sessionData.Add(entry.Key, value.ToString()); 
     } 
    } 
} 

// _context is just my private HttpContext variable I set at the beginning of the class 
utility.httpContentWrite(_context, sessionData); 
} 

5) Я создал угловую службу, которая извлекает страницу обработчик ASHX

// Load Session 
getSession: function() { 
    return $http.get('../../handlers/getSessionData.ashx'); 
} 

6) Я создал функцию углового контроллера для вызова службы и вытащил элемент в переменную $ scope, я установил функцию в переменную, а затем выполнил вызов функции

var setSession = function() { 

    UtilityService.getSession().success(
    function (results) { 
    $scope.session = results; 
    }); 

}; 
setSession(); 

7) Теперь я могу получить доступ к переменной

{{сессии.тест}}

8) Вы можете просмотреть все элементы, которые вы установили с помощью этого

<div ng-repeat="(key, value) in session"> 
    <span>{{key}} : {{value}}</span> 
</div> 

9) Я был в состоянии получить сеанс в рамках here

0

Просто создайте целевое действие в вашем контролере страницы, чтобы получить значение из сеанса сервера для запроса JavaScript Ajax внутри вашего кода AngularJs.

// Action to return the session value. This method should be inside a controller class. 
public object GetSession(string sessionName) 
{ 
    return Session[sessionName]; 
} 

// JavaScript code to retrieve session "TEST": 
$http.get('action/url/' + "TEST"). 
    success(function (sessionValue) { 
     alert('Session "TEST" has the following value: ' + sessionValue); 
    } 
); 
+0

Можете ли вы поделиться примером? – Demodave

+0

Я сделал редакцию моего ответа. Посмотрите, может ли это быть полезным. –