这是我运行的另一个线程Reading cookie in c#的后续跟进。然而,该帖子中的答案似乎击败了丛林,所以我想在这里简化我的问题。我想,回答这个问题,我将能够解决这个问题。现在差不多两天试图读取一个cookie,所以感谢任何帮助。
什么可能导致此行的NullReferenceException:
HttpCookie aCookie = Request.Cookies["UserSettings"];
我确信有一个名为“UserSettings”的cookie,我可以通过开发人员工具栏看到它。 所以Request或Request.Cookies必须为null,对吗?
为什么我不能使用Request.Cookies?我看的每一个cookie教程都是这样的。
编辑:在index.aspx中添加了cookie创建代码,顺便说一下我试图在HomeController.cs中读取cookie,不知道这是否重要,但是想到id提到它。
<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>
答案 0 :(得分:3)
这不是添加cookie的地方。当您谈论用户设置时,尤其不是添加cookie的地方。用户设置通常是在用户的动作下建立的,例如用户。用户单击德语链接以切换到德语设置。它位于此控制器方法,事件中,或者您的应用程序正在处理应将cookie设置为响应并建立其持久性的单击行为。
另外,请记住几件事。在此方法中,您将此Cookie添加到每个响应。在随后的控制器调用hc.getLang()
中,您正在访问从cookie中检索语言的请求。在第一次调用时,这将始终为null,因为cookie尚未存在于请求中。您只是将其添加到响应中。然而,在下一次调用时,cookie应该存在,但它将始终存在,语言设置为“nl”,因为您强制它为每个请求。
我建议你从这个global.asax事件中取出cookie生成代码,然后将它放在一个使用界面来设置它的页面中(一个链接,一个按钮,等等)。然后您的控制器将从该点访问请求cookie。始终记住,请求和响应在页面的生命周期中是完全独立的对象,无论它是webforms还是mvc。
修改强>
因为你提到使用控制器,我假设你正在使用MVC,所以我将我的代码示例作为目标。由于已确定在Application_BeginRequest
中设置cookie是不好的魔法,因此您需要在应用程序中的某个其他位置建立它以引用用户操作。假设您有一个名为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"]
。