【问题标题】:Session doesn't work会话不起作用
【发布时间】:2018-10-30 05:51:05
【问题描述】:

所以,我正在尝试制作一个 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 版本 15.7,所以我假设我的 MVC 是 5.2.3,如果这甚至需要知道的话。

编辑: 控制器中的代码到最后没有任何问题。我逐行调试了控制器,它按照我的设计工作。就在“返回”之前,我尝试阅读 session["Time"] 并显示它就在那里。一旦执行返回到 JS,浏览器不会显示键“Time”下有会话数据,因此我的“if(sessionStorage.Time == "1")”语句毫无意义。

【问题讨论】:

  • 这里有太多关于您所做的任何调试以及如何使用此客户端的未知数。此外,onreadystatechange 内的return 也很可疑,因为没有地方可以返回。首先展示你如何使用这个客户端,然后做一些基本的调试来确定问题是客户端还是服务器端
  • 另外,既然您已经在使用 jQuery,应该考虑使用 $.ajax 而不是创建自己的 XMLHttpRequest,这样您就可以利用它的错误处理功能
  • 我的问题不在于脚本,而在于我无法从控制器设置会话,我应该能够做到。
  • 为什么不返回一个json对象呢?这根本不需要会话
  • 因为这不是一个项目,而是一种实践。我知道我可以使用 json 对象作为返回类型,但我想知道为什么会话部分不起作用,它应该是。在这个例子中我做错了什么?

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


【解决方案1】:

sessionStorage 在 HTML5 规范中定义。这只是客户端,因此在服务器上设置 Session 变量对 sessionStorage 客户端没有影响。 见:Does HTML5 sessionStorage exist on the server or client?

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 2014-07-09
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多