2015-04-10 2 views
0

Я проверил миллион других сообщений для той же самой ошибки здесь, но не смог найти ничего, что помогает.nullable объект должен иметь значение

У меня есть модель, как это:

public class User 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public int? CommunityId { get; set; } 
    public string Email { get; set; } 
    public Int64? Phone { get; set; } 
    public AlertMode AlertMode { get; set; } 
    public string B64EncodedImage { get; set; } 
} 

Когда я получаю пользователя из базы данных, назначение выглядит следующим образом:

User user = new User() 
{ 
    UserId = Convert.ToInt32(reader["UserId"]), 
    UserName = Convert.ToString(reader["UserName"]), 
    CommunityId = reader["CommunityId"] == DBNull.Value 
     ? (int?)null : Convert.ToInt32(reader["CommunityId"]), 
    Phone = reader["Phone"] == DBNull.Value 
     ? (Int64?)null : Convert.ToInt64(reader["Phone"]), 
    AlertMode = (AlertMode)Int32.Parse(reader["AlertMode"].ToString()), 
    Email = Convert.ToString(reader["Email"]), 
    B64EncodedImage = Convert.ToString(reader["B64EncodedImage"]) 
}; 

Когда я называю этот код:

 @((BusinessLogic.GetUserByUserId(WebSecurity.CurrentUserId)).CommunityId.HasValue 
       ? "COMMUNITYID" 
       : "Not set!" 
      ) 

Я получаю эту ошибку:

Nullable object must have a value. 

На этой линии:

@((BusinessLogic.GetUserByUserId(WebSecurity.CurrentUserId)).CommunityId.HasValue 

Любые идеи, почему?

=============================================================================================================================================== ======================== EDIT:

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

public ActionResult Manage() 
    { 
     User user = BusinessLogic.GetUserByUserId(WebSecurity.CurrentUserId); 
     return View(user); 
    } 

Пошаговое модель заполняется, но CommunityId равно нулю (что должно быть хорошо)

  @(Model.CommunityId.HasValue 
       ? "COMMUNITYID" 
       : "Not set!" 
      ) 

Теперь я получаю:

Cannot perform runtime binding on a null reference 

ответ

0

Возможно, ваша функция BusinessLogic.GetUserByUserId возвращает нуль, возможно, она не распознает идентификатор пользователя? Если вы используете отладчик VS, вы должны проверить состояние переменных или, возможно, разделить их на отдельные строки, чтобы упростить отладку.

0

Если BusinessLogic.GetUserByUserId (WebSecurity.CurrentUserId) не удается вернуть объект, например, WebSecurity.CurrentUserId возвращает ноль, тогда .CommunityId выдаст исключение (например, вы пытаетесь получить доступ к свойству идентификатора сообщества на объекте, который нулевой).

Нарушение этого вверх в кратной линии, как ниже будет легче определить, где дела идут плохо:

var user = BusinessLogic.GetUserByUserId(WebSecurity.CurrentUserId); 
if (user != null) 
{ 
    return user.CommunityId.HasValue? "COMMUNITYID" : "Not set!"; 
} 

// throw an ArgumentNullException (or something similiar) so that you know what happened 
throw new ArgumentNullExpception("user); 
0

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

+0

Это объясняет, почему я не смог воссоздать исключение :). Вы должны исключить этот ответ. –

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