2

I want to use Session in an action of my MVC controller but I encountered this error but I'm not sure why the error is coming out.

System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.Web.HttpContext.Current.get returned null.

Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using fyp.Models;
using System.Security.Claims;
using System.Data;
using System.Web;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;


namespace fyp.Controllers
{
    public class CustomerController : Controller
    {
        //Omitted actions

        [HttpGet]
        public IActionResult StartOrderMenu()
        {
            ViewData["Layout"] = "_Layout";
            List<Cart> carts = new List<Cart>();
            var jsoncart = JsonConvert.SerializeObject(carts);
            System.Web.HttpContext.Current.Session["cart"] = jsoncart;
            DbSet<Food> dbs = _dbContext.Food;
            List<Food> model = dbs.ToList();
            return View(model);
        }
    }
}
jegtugado
  • 5,081
  • 1
  • 12
  • 35
Ng Hong Han
  • 23
  • 1
  • 1
  • 3
  • Simply assign `Session["cart"] = jsoncart;` will work because it comes from `Controller` class. The `System.Web.HttpContext.Current` instance may having no context at the time you're using it. – Tetsuya Yamamoto Aug 02 '18 at 05:30
  • 1
    Possible duplicate of [What is a NullReferenceException, and how do I fix it?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Divyang Desai Aug 02 '18 at 05:31
  • @TetsuyaYamamoto if I use `Session["cart"] = jsoncart;` I will get `The name 'Session' does not exists in the current context` – Ng Hong Han Aug 02 '18 at 05:35
  • 2
    Sorry, I'm forgot you're using Core MVC. The `Session` usage is slightly different because `System.Web` namespace not exist (see [this reference](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-2.1)): `HttpContext.Session.SetString("cart", jsoncart);`. – Tetsuya Yamamoto Aug 02 '18 at 05:41

1 Answers1

2

The System.Web namespace is not used in ASP.NET Core MVC, hence System.Web.HttpContext.Current property will always return null value (note that HttpContext is injected). If you want to set session variable in IActionResult controller, you can use SessionExtensions.SetString method:

string key = "cart";

HttpContext.Session.SetString(key, jsoncart);

If you want to retrieve it, use SessionExtensions.GetString method:

string jsonCart = HttpContext.Session.GetString("cart");

Note: To get HttpContext instance work, put using Microsoft.AspNetCore.Http; before namespace declaration.

Further reference: Session and app state in ASP.NET Core

Tetsuya Yamamoto
  • 24,297
  • 8
  • 39
  • 61