3

Посмотрите на этот код:Использование условного оператора? для проверки переменной нулевой сессии

System.Web.SessionState.HttpSessionState ss = HttpContext.Current.Session["pdfDocument"] ?? false; 

     if ((Boolean)ss) 
     { 
      Label1.Text = (String)Session["docName"]; 
     } 

В основном я хочу, чтобы проверить, если HttpContext.Current.Session [ «pdfDocument»] не равно нулю, и если оно не бросать до Boolean, затем проверьте, истинно это или false.

Я стараюсь избегать вложенных утверждений if и фигурирует, что будет более элегантный способ сделать это. Поэтому меня интересуют только ответы, содержащие условные выражения? оператор.

Любые советы?

+1

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

+0

Я думаю, проблема в том, что HttpContext.Current.Session ["pdfDocument"] вернет объект типа not System.Web.SessionState.HttpSessionState. объект ss = HttpContext.Current.Session ["pdfDocument"] ?? ложный; – Roadie57

+0

System.Web.SessionState.HttpSessionState ss = ((HttpContext.Current.Session ["pdfDocument"])! = Null? ((Convert.ToBoolen (HttpContext.Current.Session ["pdfDocument"]))? True: false) :) – KhanZeeshan

ответ

3

Почему вы используете переменную сс?

Что об этом:

if (HttpContext.Current.Session["pdfDocument"] != null) 
{ 
    Label1.Text = (String)Session["docName"]; 
} 
+0

. Я отбросил код выше и пошел с этим, большое спасибо –

+0

@ eddy556, добро пожаловать – bniwredyc

0

Проблема заключается в том, что вы не можете сделать это:

SessionState.HttpSessionState ss = false; 

Попробуйте положить ваше вложенное сослагательное наклонение в метод расширения, то называть это вместо этого.

-1

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

System.Web.SessionState.HttpSessionState ss = HttpContext.Current.Session["pdfDocument"]; 
if (ss != null) 
{ 
    Label1.Text = (String)Session["docName"]; 
} 
+0

Это не скомпилировалось, потому что вы ошибочно полагаете, что индексор 'HttpSessionState [string]' будет возвращать объект 'HttpSessionState', где он фактически возвращает только« объект » – Dave

2
object ss = HttpContext.Current.Session["pdfDocument"] ?? false; 
    if ((Boolean)ss) 
    { 
     Label1.Text = (String)Session["docName"]; 
    } 
1

Не уверен, что именно то, что вы просите, как насчет:

System.Web.SessionState.HttpSessionState ss; 

Label1.Text = (Boolean)((ss = HttpContext.Current.Session["pdfDocument"]) ?? false) ? (String)Session["docName"] : Label1.Text; 

Если оставить сс либо действительной сессии или нуль, позволяет избежать проблемы пытаясь сохранить false в ss и полностью пропускает последующие «if». Хотя есть повторение Label1.Text.

Примечание: это было отредактировано, чтобы учесть комментарий Дейва ниже.

+1

Я уверен, что это не скомпилировалось, потому что вы объявили 'ss' как объект' HttpSessionState', и вы пытаетесь пустить этот тип с несовместимым ' bool' type. – Dave

+0

Извините, у меня есть приоритет моего оператора. Поскольку '=' имеет более низкий приоритет, чем '??' ss = HttpContext.Current.Session ["pdfDocument"] нуждается в дополнительном наборе скобок. Как и в: (Boolean) ((ss = HttpContext.Current.Session ["pdfDocument"]) ?? false) – Tommy

0

Вы можете попробовать это, хотя я не знаю, если она соответствует вашим эстетику:

bool isPdfDocumentSet = 
    bool.TryParse((HttpContext.Current.Session["pdfDocument"] as string, 
     out isPdfDocumentSet) 
      ? isPdfDocumentSet 
      : false; 

EDIT: Существует на самом деле еще более краткий способ сделать это:

bool isPdfDocumentSet = 
    bool.TryParse(HttpContext.Current.Session["pdfDocument"] as string, 
      out isPdfDocumentSet) && isPdfDocumentSet; 
+0

's первый аргумент' bool.TryParse' принимает 'string', а не' object', который возвращается индексатор 'HttpSessionState [string]'. Кроме того, даже если вы попытаетесь передать значение в «pdfDocument» в строку, вы должны сделать предположение, что вы будете хранить строковое значение, которое 'bool.TryParse' может анализировать. – Dave

+0

Вы правы в части объекта. Однако именно потому, что я не хочу предполагать, что он может быть проанализирован, я использую TryParse(), а не Parse(). –

+0

, добавив 'ToString()' теперь вы получите 'NullReferenceException', если в этом месте нет сеанса. – Dave

0

HttpContext.Current.Session является объектом System.Web.SessionState.HttpSessionState, который является хешем или словарем, как некоторые могут его назвать, из разных объектов, поэтому, если вы не храните объект HttpSessionState в качестве местоположения «pdfDocument», первая строка неверна.

Если вы на самом деле храните bool в «pdfDocument», который может быть или не быть уже в этом слоте, вы можете применить его непосредственно к bool и null, свернув его: var ss = (bool)(HttpContext.Current.Session["pdfDocument"] ?? false);.

Если вы, возможно, храните какой-либо другой объект в «pdfDocument», вы можете просто увидеть, находится ли он в этом месте, проверив нулевое значение: var ss = HttpContext.Current.Session["pdfDocument"] != null;.

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