2009-12-18 4 views

ответ

3

Cast его в междунар:

if ((int) Session["test"] != myNum) ... 
+0

Это сработало, но теперь ссылка на объект не задана ... что мне не хватает? – MrM

+0

Сначала проверьте нуль. –

+0

Просто используйте Convert.ToInt32() в соответствии с моим ответом. Тогда вам не нужно проверять значение null. –

5

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

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

MyNumber будет 0, если «тест» равно нулю или не число

+2

Это может вызвать проблему, которая не должна быть закрыта. Если 0 - действительное число, вы можете захотеть, чтобы это исключение (или для явной проверки сначала null). – popester

0

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

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, если ваш сеанс истек, что может быть нежелательно в зависимости от вашего приложения.

1

Другой способ проверки и использования значения, хранящегося в объекте 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

Это ужасный способ сделать это. Вам не только нужно проверить NULL, но вы разбираете строку без причины. – popester

+0

+1, @popester: вы ошибаетесь sir – stephenbayer

+0

@ggomez, вы вызываете .ToString() на сеансе ["test"], который может быть нулевым, что вызовет исключение, поэтому вам все равно придется проверять.TryParse даже не начнет вызываться, если Session ["test"] имеет значение NULL. – popester

1

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

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

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

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; 
} 

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

Смежные вопросы