Как преобразовать переменную сеанса в целочисленный тип в С#

Я использую С#

Я пытаюсь проверить, не превышает ли моя попытка входа в систему 3, я имею в виду следующее условие:

if (((int)Session["LoginAttempt"]) != 3)
{
}

В состоянии сбоя при входе в систему я делаю приращение, как показано ниже:

Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;

Но это выдает мне эту ошибку: "Ссылка на объект не установлена для экземпляра объекта".

Предложения, пожалуйста!

Ответ 1

Извините, ребята,

Я просто изменил целочисленный код преобразования из

((int) Session["LoginAttempt"])

к

Convert.ToInt32(Session["LoginAttempt"]) + 1;

и теперь он отлично работает для меня, пожалуйста, предложите установить любые проблемы.

Спасибо!

Ответ 2

Попробуйте ввести волшебный код:

Session["LoginAttempt"] = ((int?)Session["LoginAttempt"] ?? 0) + 1;

Это преобразует переменную сеанса Session["LoginAttempt"] в значение с нулевым значением int (a int, которое может быть null); ?? 0 предоставляет значение 0, если оно равно null, поэтому вычисление завершается успешно.

Session["LoginAttempt"] может быть нулевым, если он ранее не инициализирован.

Ответ 3

Вам нужно проверить, существует ли переменная Session, прежде чем вы сможете ее использовать и назначить ей.

Здесь вы делаете приращение:

Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;

Но, если Session["LoginAttempt"] не существует, это объяснит вашу ошибку. Быстрый null тест перед приращением должен отсортировать его.

if (Session["LoginAttempt"] != null)
    Session["LoginAttempt"] = ((int)Session["LoginAttempt"]) + 1;

Ответ 4

Почему бы не инкапсулировать значение LoginAttempt в качестве свойства и автоматически назначить значение:

protected int LoginAttempt
{
    get
    {
        if (Session["LoginAttempt"] == null)
        {
            Session["LoginAttempt"] = 1;
        }
        return Convert.ToInt32(Session["LoginAttempt"].ToString());
    }
    set
    {
        Session["LoginAttempt"] = value;
    }
}

так что основная часть функции более читаема:

if (LoginAttempt < 3)
{
}

Ответ 5

Это будет сделано в первый раз, когда вы попытаетесь установить его, если вы еще не инициализировали его ранее. Вместо этого попробуйте:

if (Session["LoginAttempt"] == null)
    Session["LoginAttempt"] = 1;
else
    ((int)Session["LoginAttempt"]) += 1;

Ответ 6

Вы в какой-то момент инициализируете его, прежде чем пытаться извлечь и/или увеличить его?

Ответ 7

Разделите свой нетривиальный код по частям:

int sessionLogicAttempt = (int)Session["LoginAttempt"];
int someValue = sessionLogicAttempt + 1;
Session["LoginAttempt"] = someValue;

Также добавьте утверждения для проверки значений, которые вы принимаете.

Ответ 8

//read
object attemptObj = Session["LoginAttempt"]
int attempt = 0;
if (attemptObj != null) attempt = (int)attemptObj ;

////write
Session["LoginAttempt"] = attempt++;

Ответ 9

попробуйте сделать что-то, что может быть пустым.

int i = Session["val"] == null ? 0 : (int)Session["val"];

хотя это может повредить вам, если какой-либо другой программист использует ваш сеанс "val" и помещает там значение non int.

        int y = 0;
        if (int.TryParse(Session["val"] == null ? string.Empty : Session["val"].ToString(), out y))
        {
            // got your int value
        }
        else
        {
            // no int value in session val
        }