我已经在这里检查了其他数百万条相同错误,但找不到任何有用的信息。
我有一个这样的模型:
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
任何想法为什么?
=============================================== ======================= 编辑:
我更改了代码以将用户作为模型返回到视图:
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 :(得分:0)
您的BusinessLogic.GetUserByUserId
函数是否可能返回null,或许它无法识别用户ID?如果您正在使用VS调试器,您应该能够检查变量的状态,或者可能将它们拆分为单独的行以使调试更容易。
答案 1 :(得分:0)
如果BusinessLogic.GetUserByUserId(WebSecurity.CurrentUserId)失败以返回对象,例如WebSecurity.CurrentUserId返回零,那么.CommunityId将抛出异常(也就是说您尝试访问对象上的社区Id属性)那是NULL)。
将此分解为多行,如下所示,可以更容易地确定出错的地方:
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);
答案 2 :(得分:0)
问题在于,在视图中的另一段代码中,我试图尝试访问空值,并且调试器错误地指向了错误的错误位置。