PagesIndex - ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
1 голос
/ 20 ноября 2011

Независимо от того, как я переворачиваю этот скрипт, он все равно выдает мне сообщение Object reference not set to an instance of an object., когда я отлаживаюсь (программа работает нормально, если я не отлаживаю, но каждый раз, когда я отлаживаю, я получаю это сообщение, почему это так?)

public string GetTemplate(int pageId)
{
    string template = "";

    PagesIndex qq = new PagesIndex();
    qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault();

    if (qq.Template == null) //Here on  qq.Template - Object reference not set to an instance of an object.
    {
        template = "_Layout";
    }
    else
    {
        template = qq.Template;
    }
    return template;
}

Надеюсь, вы можете изменить мое настроение:)

Ответы [ 4 ]

4 голосов
/ 20 ноября 2011

Возможно qq, полученное в результате LINQ, равно нулю.
Попробуйте это

public string GetTemplate(int pageId)
{
    string template = "";
    PagesIndex qq = new PagesIndex();
    qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault();

    if (qq == null || qq.Template == null)
        template = "_Layout";
    }
    else
    {
        template = qq.Template;
    }
    return template;
}

или коротко:

public string GetTemplate(int pageId)
{
    PagesIndex qq = db.PagesIndexes
                      .Where(p => p.Id == pageId)
                      .SingleOrDefault();
    return qq == null || qq.Template == null ?
           "_Layout" :
           qq.Template;
}
3 голосов
/ 20 ноября 2011

Строка, которая выдает ошибку, может выдать NullReferenceException, только если qq равно null.Это происходит, если строка не найдена в строке ранее.Я думаю, вы думали, что qq никогда не может быть нулевым, потому что вы присвоили ему ненулевое значение.Однако после этого строка перезаписывает это значение на ноль, если строка не найдена.

PagesIndex qq = new PagesIndex();  // Pointless and misleading assignment!
qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault();

Вместо этого вы можете сделать это следующим образом, используя оператор null-coalescing :

public string GetTemplate(int pageId)
{
    return db.PagesIndexes
             .Where(p => p.Id == pageId)
             .Select(p => p.Template)
             .SingleOrDefault() ?? "_Layout";
}
0 голосов
/ 20 ноября 2011

Возможно, вы ловите исключение где-то в вашем коде, и поэтому вы его не видите. Ваш оператор LINQ не возвращает результат. Проверьте qq на ноль, а не qq.Templates.

if(qq != null) { if (qq.Templates != null)... }

0 голосов
/ 20 ноября 2011

Вот моё подозрение.При отладке вы используете экземпляр базы данных, который не имеет никаких данных (или совпадающих данных) в таблице PagesIndexes.Это означает, что qq будет нулевым в результате запроса (часть по умолчанию SingleOrDefault).Вы можете убедиться в этом, проверив строку подключения, чтобы убедиться, что она идет вразрез с ожидаемой БД, и осмотрев эту БД, чтобы убедиться, что в ней есть данные, которые, как вы ожидаете, будут там.Вы также должны проверить, является ли qq нулевым, прежде чем использовать его.

 if (qq == null || qq.Template == null)
 {
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...