如何在ASP.Net MVC控制器中检索浏览器会话数据?

时间:2017-11-29 18:55:15

标签: c# asp.net asp.net-mvc session

我在这个问题上度过了非常艰难的时期。我已经做了很多研究,但没有发现任何有用的东西!

我想做什么: 我想使用javascript来捕获用户的时区和utc时区偏移量,将这两个数据存储在浏览器会话中,然后在控制器中检索它们。

工作原理: 我的javascript正在努力提取用户的时区和时区偏移量,并将这两个变量保存到会话中。以下是我工作的JS:

<script type="text/javascript">
 window.onload = function () {
     var UserTime = new Date();
     var stringtz = UserTime.toString();
     var tzstart = stringtz.indexOf("(") + 1;
     var tzend = stringtz.indexOf(")");
     var userTZ = stringtz.slice(tzstart, tzend);
     sessionStorage.setItem("userTZOffset", UserTime.getTimezoneOffset().toString());
     sessionStorage.setItem("userTZ", userTZ);
 };
</script>

什么不行: 当用户登录时,我想获取会话中保存的两个变量(userTZ和userTZOffset)并为它们创建声明。但是,当我尝试将它们拉入我的控制器时,我得到null作为值。经过进一步检查,我可以看到会话超时,id等,但键和值都是空白的。

以下是我在控制器中登录操作的代码片段:

        var claims = UserManager.GetClaims(user.Id);

        var timezoneclaim = claims.First(c => c.Type == "UserTZ");
        UserManager.RemoveClaim(user.Id, timezoneclaim);

        var timezoneoffsetclaim = claims.First(c => c.Type == "UserTZOffset");
        UserManager.RemoveClaim(user.Id, timezoneoffsetclaim);

        var test = HttpContext.Session["userTZ"];
        var test2 = HttpContext.Session["userTZOffset"];

        UserManager.AddClaim(user.Id, new Claim("UserTZ", test.ToString()));
        UserManager.AddClaim(user.Id, new Claim("UserTZOffset", test2.ToString()));

我在此设置断点并遍历代码,但每次,test和test2都为null。当我在断点上查看会话本身时,我看到了SessionId,Timeout等,但计数为0且Key计数为0。

我试过了:

  1. 添加删除名称=&#34;会话&#34;并添加name =&#34; Session&#34;类型=&#34; System.Web.SessionState.SessionStateModule&#34;根据我发现here
  2. 的类似问题,我的webconfig
  3. 我尝试添加Microsoft.Aspnet.Session nuget包并遵循this教程,但我的项目的startup.cs没有ConfigureServices部分并添加了我自己的didn&t工作要么。
  4. 我根据找到的here在webconfig中将会话状态设置为InProc,但同样没有任何改变。
  5. 思想?

2 个答案:

答案 0 :(得分:0)

您无法使用HttpContext.Session["userTZ"],因为从客户端传递的数据不会存储在服务器端Session State内。相反,您需要使用HiddenValue将这些值传递回服务器。

enter image description here

LoginViewModel

public class LoginViewModel
{
    ...        
    public string UserTZ { get; set; }        
    public string UserTZOffset { get; set; }
}

视图

@using (Html.BeginForm(...))
{
     ...

    @Html.HiddenFor(m => m.UserTZ)
    @Html.HiddenFor(m => m.UserTZOffset)
}

<script type="text/javascript">
    $(function() {
        var UserTime = new Date();
        var stringtz = UserTime.toString();
        var tzstart = stringtz.indexOf("(") + 1;
        var tzend = stringtz.indexOf(")");
        var userTZ = stringtz.slice(tzstart, tzend);
        $("#@Html.IdFor(m => m.UserTZOffset)").val(UserTime.getTimezoneOffset().toString());
        $("#@Html.IdFor(m => m.UserTZ)").val(userTZ);
    });
</script>

控制器

[HttpPost]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    string userTZ = model.UserTZ,
           userTZOffset = model.UserTZOffset;
    ...
}

答案 1 :(得分:0)

会话在服务器端维护。因此,如果要存储用户时区和偏移量,则应根据客户端的某些事件(如登录按钮单击)将它们从客户端传递到mvc控制器。然后在服务器上,您可以将它们存储在会话变量中,并且对于同一会话中的后续请求,您可以在服务器上检索这些值。对于后续请求,您还可以将这些会话值从控制器传递到其他视图(使用ViewBag / Viewdata)。如果您需要一个代码段,请告诉我。