Прямой ответ на использование переменных сеанса в представлениях MVC?

У меня возникают трудности с использованием переменных сеанса в представлениях MVC. В моем примере ниже условие If в моем представлении не выполняется, когда я устанавливаю для переменной сеанса IsLoggedIn значение true через контроллер. Примечание. Я обрезал часть ненужного кода для облегчения чтения. Заранее спасибо!

Контроллер:

    public ActionResult Index(int id = 0)
    {
        JobSummaryModelHelper jobDetails = new JobSummaryModelHelper();
        jobDetails.Id = id;  

        jobDetails.jdata = .....

        return View(jobDetails);
    }

    public ActionResult Authenticate()
    {
        .....

        int usercount = db.JobBoardUsers.Where(u => u.userid.Equals(un) && u.passcode.Equals(pc)).Select(u => new AccountModel() { uid = u.id }).Count();
        if (usercount > 0)
        {
            HttpContext.Session["IsSignedIn"].Equals(true);              
        }
        return RedirectToAction("Index", jobDetails);           

Вид:

 .....

@if (Convert.ToBoolean(Session["IsSignedIn"]))
{
    <fieldset>
        <legend></legend>
        <p style="color: red; font-weight: bold;">Logged in!
        </p>
    </fieldset>
}

person Ryan    schedule 05.02.2014    source источник


Ответы (3)


Действие вашего контроллера не устанавливает для переменной сеанса значение true.

Для этого нужно заменить

HttpContext.Session["IsSignedIn"].Equals(true);

с

HttpContext.Session["IsSignedIn"] = true;

Метод Equals не изменяет значение a, это метод, который сообщает вам, равны ли две вещи. Он имеет возвращаемое значение, но вы ничего с ним не делаете.

person Martin Booth    schedule 05.02.2014

В вашем коде эта строка

HttpContext.Session["IsSignedIn"].Equals(true);

Должно быть либо это

HttpContext.Current.Session["IsSignedIn"] = true;

или это

Session["IsSignedIn"] = true;

Причина - вам нужно получить доступ к сеансу в текущем HttpContext. Либо пропуская HttpContext (контроллер имеет ссылку на текущий HttpContext), либо явно определяя его HttpContext.Current, вы гарантируете, что устанавливаете правильные значения сеанса для текущего HttpContext. Кроме того, я внес изменения в то, как вы устанавливаете свойство, я не уверен, что .Equals() будет делать то, что вы хотите. Однако я знаю, что использование явного знака = будет.

person Tommy    schedule 05.02.2014

Измените его на HttpContext.Current.Session[IsSignedIn] = true, а затем получите доступ к нему таким же образом в представлении. (HttpContext.Current.Session[IsSignedIn])

person Jason Roell    schedule 05.02.2014