所以,我正在尝试创建一个Web应用程序。在注册期间,我要求用户输入他的工作经验。在此期间,我测试用户工作的时间跨度是否与之前输入的时间跨度重叠,只是为了警告他。我使用控制器和JS脚本。
这是我的控制器方法:
public void TimeCheck()
{
string time = Request.QueryString.ToString();
using (ITExpertsContext db = new ITExpertsContext())
{
int id = db.Users.FirstOrDefault(x => x.Email.Equals(User.Identity.Name)).UserId;
List<WorkingAt> currentHistory = db.WorkingAts.Where(x => x.UserId == id).ToList();
TimeFrame frame = new TimeFrame();
frame.Since = DateTime.Parse(time.Split('&')[0].Split('=')[1]);
frame.Until = DateTime.Parse(time.Split('&')[1].Split('=')[1]);
foreach (WorkingAt w in currentHistory)
{
if ((w.Since < frame.Until && w.Until > frame.Until) || (w.Since < frame.Since && w.Until > frame.Since))
{
Session["Time"] = "1";
return;
}
}
Session["Time"] = "0";
}
}
这是我从视图中看到的JS方法:
function TimeCheck() {
var request = new XMLHttpRequest();
request.open("GET", "/account/TimeCheck/?since=" + $("#Since").val() + "&until=" + $("#Until").val());
request.send();
request.onreadystatechange = function () {
if (request.status == 200 & request.readyState == 4) {
if (sessionStorage.Time == "1") {
var choice = confirm("The time you selected overlaps with your previous working experience. Do you still want to add it?");
if (choice == true) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
}
}
所有这一切的问题是我的会话根本没有改变,也就是说不存在。当我从JS设置它(用于测试目的)时,它工作得很好。我究竟做错了什么?
我正在使用最新的VS 2017 ver 15.7,所以我假设我的MVC是5.2.3,如果甚至需要知道的话。
编辑: 控制器中的代码到达最后没有任何问题。我逐行完成了控制器的调试,它按照我设计的方式工作。就在“返回”之前,我尝试阅读会话[“时间”],它显示它就在那里。一旦执行回到JS,浏览器就不会显示“Time”键下的会话数据,因此我的“if(sessionStorage.Time ==”1“)”语句毫无意义。
答案 0 :(得分:1)
sessionStorage在HTML5规范中定义。这只是客户端,因此在服务器上设置Session变量对sessionStorage客户端没有影响。 请参阅:Does HTML5 sessionStorage exist on the server or client?