在ASP.NET中检查Cookie的值会导致对象引用空例外

时间:2016-05-26 11:13:28

标签: c# asp.net entity-framework cookies

当我尝试访问cookie时,出现以下异常:

  

对象引用未设置为对象的实例。

这是有问题的一行:

if (Request.Cookies["selectBoxValue"].Value != null)

控制器

[Authorize]
        public ActionResult Index()
        {
            if (Request.Cookies["selectBoxValue"].Value != null)
            {
                HttpCookie groupId = new HttpCookie("selectBoxValue");
                groupId = Request.Cookies["selectBoxValue"];

                // Collect all comments connected to current group
                int t = Convert.ToInt32(groupId.Value);
                pv.ListofComments = db.Comments.Where(dp => dp.GroupID == t).ToList();

                // Show only groups connected to current user
                var CurrentUser = User.Identity.GetUserId();
                var groupUser = db.GroupUsers.Where(u => u.ApplicationUserId == CurrentUser).Select(gr => gr.GroupId).ToList();
                pv.GroupList = db.Groups.Where(g => groupUser.Contains(g.Id));
                return View(pv);

        }

2 个答案:

答案 0 :(得分:2)

您的错误是因为该链中的某些内容不存在:

if (Request.Cookies["selectBoxValue"].Value != null)

要检查的事项:

var myCookie = Request.Cookies["selectBoxValue"];
myCookie!= null; 
myCookie.Length > 0;

您很可能没有Request上有selectBoxValue的cookie。由于selectBoxValue(来自它的名字)听起来就像你的表格本身,我很好奇为什么你要为它检查一个cookie?如果它是来自上一页(不是将请求发送到服务器的那个)的持久值,则称之为比selectBoxValue更直观的内容。

了解有关如何编写cookie和阅读cookie的更多信息;见Stack Overflow answer

如果您希望用户拥有一个名为selectBoxValue的Cookie而他们没有,那么您就会遇到一个特定的问题:无论您在哪里设置该Cookie,都不会在{{{ 1}}。

如果你对它没问题(也就是说,某些代码路径期望cookie而其他代码没有),那么如果该cookie不存在,你可以将你正在玩的对象设置为合理的值:

Response

您的代码也存在一些问题:

int defaultGroupId = 1;
var obj = Request.Cookies["selectBoxValue"] ?? defaultGroupId;

为什么创建cookie只是为了不使用它?

如果您要将Cookie发送到某个地方,则只会创建Cookie。所以在这里你应该写一些像:

if (Request.Cookies["selectBoxValue"].Value != null)
{
  HttpCookie groupId = new HttpCookie("selectBoxValue"); //why create one?
  groupId = Request.Cookies["selectBoxValue"];

  // Collect all comments connected to current group
  int t = Convert.ToInt32(groupId.Value);
}

}

答案 1 :(得分:0)

您正在检查Cookie的值是否为空,可能是也可能不是。如果尚未设置cookie,则 cookie本身为空,这意味着如果您尝试访问cookie的值,则会出现异常。

以下是您需要检查的代码段。

//retrieve the cookie
var cookieSelectBoxValue = Request.Cookies["selectBoxValue"];

//Check if the cookie itself is null
if(cookieSelectBoxValue != null)
{
    //Retrieve the value of the cookie
    var cookieValue = cookieSelectBoxValue.Value;

    //Check if the value of the cookie is null
    if(cookieValue!= null)
    {
        //The rest of your logic goes here
    }
}

要设置cookie,您可以在Controller Action中使用Response.SetCookie()方法。这是一个简单的例子:

public ActionResult Index()
{
    if (Request.Cookies["selectBoxValue"] != null)
    {
        var cookie = new HttpCookie("selectBoxValue")
        {
            Expires = DateTime.Now.AddYears(1),
            Value = "CookieValueGoesHere"
        };
        Response.Cookies.Add(cookie);
    }
    return View("Index");
}