Используя условный оператор? проверить нулевую переменную сеанса

Посмотрите на этот код:

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

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

По сути, я хочу проверить, не является ли HttpContext.Current.Session["pdfDocument"] нулевым, и если он не приведен к логическому типу, то проверить, является ли оно истинным или ложным.

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

Какие-нибудь советы?

7 ответов

Решение

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

Как насчет этого:

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

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

System.Web.SessionState.HttpSessionState ss;

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

Следует оставить ss с допустимым сеансом или с нулевым значением, избегает проблемы с попыткой сохранить false в ss и полностью пропускает последующее "если". Хотя есть повторение Label1.Text.

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Существует на самом деле еще более краткий способ сделать это:

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

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

SessionState.HttpSessionState ss = false;

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

Я думаю, что наиболее близким к этому решению будет следующее:

System.Web.SessionState.HttpSessionState ss = HttpContext.Current.Session["pdfDocument"];
if (ss != null)
{
    Label1.Text = (String)Session["docName"];
}
Другие вопросы по тегам