0

这是我正在运行的另一个线程的跟进,它是Reading cookie in c#。但是,该帖子中的答案似乎在拐弯抹角,所以我想在这里简化我的问题。我认为回答这个问题,我就能解决这个问题。卡住了将近两天,现在试图读取一个 cookie,因此感谢您的帮助。

什么可能导致此行出现 NullReferenceException:

HttpCookie aCookie = Request.Cookies["UserSettings"];

我确信存在一个名为“UserSettings”的 cookie,正如我在开发人员工具栏上看到的那样。所以 Request 或 Request.Cookies 必须为空,对吧?

为什么我不能使用 Request.Cookies?我看到的每一个 cookie 教程都是这样的。

编辑:在 index.aspx 中添加了 cookie 创建代码,顺便说一句,我试图读取 HomeController.cs 中的 cookie,不知道这是否重要,但我想我会提到它。

<script type="text/javascript">
    function setLanguage() {
    cname = "language";
    cvalue =           document.getElementById('language').options[document.getElementById('language').selectedInd    ex].value;
    cexpire = new Date();
    cexpire.addDays(1);
    document.cookie = cname + '=' + escape(cvalue) +
(typeof cexpire == 'date' ? 'expires=' + cexpire.toGMTString() : '') +
',path=/;';
}
</script>
4

1 回答 1

3

这不是添加 cookie 的地方。当您谈论用户设置时,它尤其不是添加 cookie 的地方。用户设置通常在用户的操作下建立,例如用户单击德语链接以切换到德语设置。正是在此控制器方法、事件中,或者您的应用程序正在处理应该将 cookie 设置到响应中并建立其持久性的单击行为。

另外,请记住几件事。在此方法中,您将此 cookie 添加到每个响应中。在随后的控制器调用hc.getLang()中,您正在访问从 cookie 中检索语言的请求。在第一次调用中,这将始终为空,因为 cookie 还没有存在于请求中。您只是将其添加到响应中。然而,在下一次调用中,cookie 应该存在,但它总是以设置为“nl”的语言存在,因为你为每个请求强制它。

我建议您从这个 global.asax 事件中取出 cookie 生成代码,并将其放置在使用接口设置它的页面中(链接、按钮等)。然后,您的控制器将从该点开始访问请求 cookie。永远记住,请求和响应在页面的生命周期中是完全独立的对象,无论它是 webforms 还是 mvc。

编辑: 因为您提到使用控制器,所以我假设您使用的是 MVC,所以我将针对我的代码示例以这种方式工作。由于已确定在 cookie 中设置 cookieApplication_BeginRequest是个坏魔法,因此您需要在应用程序中的某个其他位置参考用户操作来建立它。假设您有一个名为的控制器SettingsController,它有一个名为 的动作SetLanguage

[Authorize]
public class SettingsController : Controller
{

    // ... skipping other constructor and method code

    [Authorize]
    [HttpPost]
    public ActionResult SetLanguage(MyLanguageModel model)
    {
        HttpCookie myCookie = new HttpCookie("UserSettings");
        myCookie.Value = model.AssignedLanguage;
        myCookie.Expires = DateTime.Now.AddDays(1);
        Response.Cookies.Add(myCookie);

        return View(model);
    }

}

这将假定编写视图以AssignedLanguage从模型中获取属性并使用它来确定即时请求的语言。但是,所有后续请求都应该可以访问 UserSettings cookie。此时,您应该能够Request.Cookies["UserSettings"]从请求管道中的任何位置调用后续请求。

于 2012-06-14T12:58:12.713 回答