Как использовать переменную Session в операторе if как целое число? - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть сеанс, в котором хранится int. Я обычно делаю следующее ...

if(Session["test"] == null)

Теперь, когда я сравниваю ...

public ActionResult NumbersGame(int myNum)
{
if(Session["test"] != myNum)...

Как мне это сделать?

Ответы [ 5 ]

5 голосов
/ 18 декабря 2009

(int) Session ["test"] завершится ошибкой, если эта переменная сеанса будет нулевой или не является числом. Используйте это вместо ...

var myNumber = Convert.ToInt32(Session["test"]);

myNumber будет 0, если 'test' равен нулю или не является числом

3 голосов
/ 18 декабря 2009

Приведите его к int:

if ((int) Session["test"] != myNum) ...
1 голос
/ 19 декабря 2009

Простой обзор того, как я бы это сделал:

Это может решить и другие проблемы:

Сначала мы определим интерфейс:

public interface ISessionWrapper
{
    int? SomeInteger { get; set; }
}

Затем мы делаем реализацию HttpContext:

public class HttpContextSessionWrapper : ISessionWrapper
{
    private T GetFromSession<T>(string key)
    {
        return (T) HttpContext.Current.Session[key];
    }

    private void SetInSession(string key, object value)
    {
        HttpContext.Current.Session[key] = value;
    }

    public int? SomeInteger
    {
        get { return GetFromSession<int?>("SomeInteger"); }
        set { SetInSession("SomeInteger", value); }
    }
}

Затем мы определяем наш базовый контроллер:

public class BaseController : Controller
{
    public ISessionWrapper SessionWrapper { get; set; }

    public BaseController()
    {
        SessionWrapper = new HttpContextSessionWrapper();
    }
}

Наконец:

public ActionResult NumbersGame(int myNum)
{           
    if (SessionWrapper.SomeInteger == myNum)
        //Do what you want;
}

Нет необходимости кастовать здесь !! И если вы хотите проверить свой контроллер, у вас нет проблем с Session. Вы просто Mock ISessionWrapper и передаете его в переменную SessionWrapper.

1 голос
/ 19 декабря 2009

Другой способ проверки и использования значения, хранящегося в вашем объекте Session (), заключается в использовании функции TryParse.

int intTest;
if (int.TryParse(Session["test"].ToString(), out intTest))
{
   // intTest will have the value in Session["Test"] stored as an integer

}

Мне нравится это, потому что это компактно и просто.

0 голосов
/ 18 декабря 2009

Я бы проверил на ноль (чтобы определить истечение сеанса), затем произнесу:

object value = Session["test"];
if (value == null)
{
    // The value is not in Session (e.g. because the session has expired)
    // Deal with this in an application-specific way, e.g. set to a default,
    // reload the Session variable from the database, redirect to a home page, ...
    ...
}
else
{
    myNumber = (int) value;
}
...

Проблема с использованием Convert.ToInt32 заключается в том, что он просто вернет 0, если ваш сеанс истек, что может быть нежелательно в зависимости от вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...