我在这个问题上度过了非常艰难的时期。我已经做了很多研究,但没有发现任何有用的东西!
我想做什么: 我想使用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。
我试过了:
答案 0 :(得分:0)
您无法使用HttpContext.Session["userTZ"]
,因为从客户端传递的数据不会存储在服务器端Session State
内。相反,您需要使用HiddenValue
将这些值传递回服务器。
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)。如果您需要一个代码段,请告诉我。