Запутанный результат с @Session [«something_here»] (C # / Razor)

#c# #asp.net #session #razor #webmatrix

#c# #asp.net #сессия #razor #webmatrix

Вопрос:

Я тестирую несколько вещей здесь, на базовой веб-странице, и я заметил кое-что очень странное. Я не уверен, следует ли ожидать такого поведения, но это заставляет меня задуматься…

Я знаю, что могу получить текущий идентификатор пользователя, вошедшего в систему в данный момент, вот так:

 @WebSecurity.CurrentUserId
  

И просто чтобы посмотреть, как используются сеансы, я подумал, что просто сохраню (в качестве примера) CurrentUserId в переменной сеанса после входа пользователя в систему, вот так:

 @Session["UserIDthing"] = @WebSecurity.CurrentUserId;
  

И затем на другой странице я просто вывожу идентификатор сеанса (который должен быть точно равен 1, потому что это мой идентификатор пользователя), вот так:

 @Session["UserIDthing"]
  

Но вместо того, чтобы выводить «1», он выводит минус 1 «-1». Почему это происходит?

введите описание изображения здесь

И просто чтобы убедиться, что я был прав насчет идентификатора пользователя, я вывел идентификатор пользователя с помощью:

 @WebSecurity.CurrentUserId
  

И он отобразил правильный идентификатор, который равен всего лишь «1»

Ответ №1:

Вероятно, это не имеет ничего общего с Session . Попробуйте сохранить @WebSecurity.CurrentUserId каким-либо другим способом, чтобы убедиться, что CurrentUserId значение действительно было установлено после входа пользователя в систему (возможно, записав его в файл или используя статическую переменную для тестирования).

Комментарии:

1. Спасибо! Вместо того, чтобы сохранять его в сеансе сразу после входа пользователя в систему, я сохраняю его в сеансе, когда они были перенаправлены на страницу учетной записи после входа в систему. Итак, вы правы, в то время он не был установлен. Спасибо 🙂 @Eben R.

Ответ №2:

Чтобы назначить переменную, вам нужен блок кода, а не блок вывода. Вы должны использовать:

 @{ someVar = otherVar; }
  

Синтаксис, который вы используете:

 @someVar = @otherVar;
  

переводится как (псевдокод):

 Response.Write(HtmlEncode(someVar));
Response.Write(" = ");
Response.Write(HtmlEncode(otherVar));
Response.Write(";");
  

Кстати: Почему вы назначаете переменные сеанса в своем представлении. Это должно быть обязанностью контроллера.

Комментарии:

1. На веб-страницах нет таких понятий, как представления и контроллеры.

2. @Mike, я вижу, это веб-матрица. Я пытаюсь забыть подобные архитектуры.

3. Незнание вас никуда не приведет.