如何将服务器会话从 Razor MVC C# 传递到 Angularjs?

How to pass a server session from Razor MVC C# to Angularjs?

我正在尝试找出将服务器会话数据从 MVC Razor 应用程序传递到 Angularjs 的最佳方法。

在 ASP.net 中,我们能够使用 System.Web.UI.Page 创建字符串字典项并 json 序列化该数据,然后将该项传递给 [=24] 来扩展 class =],但我无法遵循相同的路径,因为我正在使用 Razor。

我目前只是传递 ViewBag.variableName 并在 ng-init 中设置值,但这并不理想。所以我想到了几个想法。

设置一个 angular 服务来获取一个 ashx 处理程序页面,使用 angular 控制器将会话放入 $scope.variable 会更好吗?或者将会话传递给视图,然后以某种方式将其放入 $scope?

从 MVC Razor 获取服务器会话变量到 angular 的最佳方法是什么?

Ok, I posted my below answer, but I'm still having trouble getting the session into scope of my multiple controllers. Because http.get is asynchronous and I can't get the results set to be dynamic.

所以这是我最终采用的方法。我只是不知道这是否是最佳实践。根据评论,我指定要发送到 angular.

的会话项目

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) 我创建了一个 angular 服务来获取 ashx 处理程序页面

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

6) 我创建了一个 angular 控制器函数来调用服务并将项目拉入 $scope 变量,我将函数设置为一个变量然后执行函数调用

var setSession = function () {

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

};
setSession();

7) 我现在可以访问我的变量

{{session.test}}

8) 您可以使用此查看您设置的所有项目

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

9) 我能够将会话纳入范围

只需在您的页面控制器中创建一个专用操作,以从服务器会话获取值到您的 AngularJs 代码中的 JavaScript Ajax 请求。

// 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);
    }
);