Asp.net 可为Null的对象上出现Null异常<;int>;
我的asp.net mvc web应用程序中有以下模型类:Asp.net 可为Null的对象上出现Null异常<;int>;,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我的asp.net mvc web应用程序中有以下模型类: public class SecurityRoleGroupAssign { public IEnumerable<TechnologyType> TechnologyType {get; set;} public IEnumerable<PermisionLevel> PermisionLevel {get; set;} public SecurityRole SecurityRol
public class SecurityRoleGroupAssign
{
public IEnumerable<TechnologyType> TechnologyType {get; set;}
public IEnumerable<PermisionLevel> PermisionLevel {get; set;}
public SecurityRole SecurityRole { get; set; }
public Nullable<int> rackPermisionLevel { get; set; }
public Nullable<int> serverPermisionLevel { get; set; }
public Nullable<int> routerPermisionLevel { get; set; }
public Nullable<int> virtualMachinePermisionLevel { get; set; }
public Nullable<int> switchPermisionLevel { get; set; }
}
问题是如果不存在任何项,
SingleOrDefault
将返回null
(对于引用类型)。因此,无论何时调用.SingleOrDefault().permissionLevelId
,您都有发生空引用异常的危险。您可以通过将.SingleOrDefault()
放在所选结果后面来解决此问题,例如(…选择p.PermissionLevelID).SingleOrDefault()
试试这个:
var permissions = tms.SecurityroleTypePermisions.Where(a => a.SecurityRoleID == RoleID);
SecurityRoleGroupAssign c = new SecurityRoleGroupAssign
{
SecurityRole = FindAllRole(RoleID),
PermisionLevel = tms.PermisionLevels.ToList(),
TechnologyType = tms.TechnologyTypes.ToList(),
serverPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "server"
select p.PermisionLevelID)
.SingleOrDefault(),
rackPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "rack"
select p.PermisionLevelID)
.SingleOrDefault(),
virtualMachinePermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "virtual"
select p.PermisionLevelID)
.SingleOrDefault(),
routerPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "router")
select p.PermisionLevelID
.SingleOrDefault(),
switchPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "switch"
select p.PermisionLevelID
.SingleOrDefault()
};
或者更好:
var permissions = tms.SecurityroleTypePermisions
.Where(a => a.SecurityRoleID == RoleID)
.ToLookup(a => a.TechnologyType.Name.ToLower(),
a => a.PermisionLevelID);
SecurityRoleGroupAssign c = new SecurityRoleGroupAssign
{
SecurityRole = FindAllRole(RoleID),
PermisionLevel = tms.PermisionLevels.ToList(),
TechnologyType = tms.TechnologyTypes.ToList(),
serverPermisionLevel = permissions["server"].SingleOrDefault(),
rackPermisionLevel = permissions["rack"].SingleOrDefault(),
virtualMachinePermisionLevel = permissions["virtual"].SingleOrDefault(),
routerPermisionLevel = permissions["router"].SingleOrDefault(),
switchPermisionLevel = permissions["switch"].SingleOrDefault()
};
问题是如果不存在任何项,
SingleOrDefault
将返回null
(对于引用类型)。因此,无论何时调用.SingleOrDefault().permissionLevelId
,您都有发生空引用异常的危险。您可以通过将.SingleOrDefault()
放在所选结果后面来解决此问题,例如(…选择p.PermissionLevelID).SingleOrDefault()
试试这个:
var permissions = tms.SecurityroleTypePermisions.Where(a => a.SecurityRoleID == RoleID);
SecurityRoleGroupAssign c = new SecurityRoleGroupAssign
{
SecurityRole = FindAllRole(RoleID),
PermisionLevel = tms.PermisionLevels.ToList(),
TechnologyType = tms.TechnologyTypes.ToList(),
serverPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "server"
select p.PermisionLevelID)
.SingleOrDefault(),
rackPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "rack"
select p.PermisionLevelID)
.SingleOrDefault(),
virtualMachinePermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "virtual"
select p.PermisionLevelID)
.SingleOrDefault(),
routerPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "router")
select p.PermisionLevelID
.SingleOrDefault(),
switchPermisionLevel =
(from p in permissions
where p.TechnologyType.Name.ToLower() == "switch"
select p.PermisionLevelID
.SingleOrDefault()
};
或者更好:
var permissions = tms.SecurityroleTypePermisions
.Where(a => a.SecurityRoleID == RoleID)
.ToLookup(a => a.TechnologyType.Name.ToLower(),
a => a.PermisionLevelID);
SecurityRoleGroupAssign c = new SecurityRoleGroupAssign
{
SecurityRole = FindAllRole(RoleID),
PermisionLevel = tms.PermisionLevels.ToList(),
TechnologyType = tms.TechnologyTypes.ToList(),
serverPermisionLevel = permissions["server"].SingleOrDefault(),
rackPermisionLevel = permissions["rack"].SingleOrDefault(),
virtualMachinePermisionLevel = permissions["virtual"].SingleOrDefault(),
routerPermisionLevel = permissions["router"].SingleOrDefault(),
switchPermisionLevel = permissions["switch"].SingleOrDefault()
};
.SingleOrDefault():
返回序列的唯一元素,如果
序列为空;如果存在更多异常,此方法将引发异常
序列中有多个元素
这里的问题是.SingleOrDefault()代码>调用返回了默认的“null”值。当您尝试对该空引用调用PermissionLevelID
时,会引发错误
您可以将其更改为:
serverPermisionLevel = tms.SecurityroleTypePermisions
.Where(a=>a.SecurityRoleID == RoleID)
.Where(a2=>a2.TechnologyType.Name.ToLower() == "server")
.Select(r => r.PermissionLevelID).SingleOrDefault();
这样,当.SingleOrDefault实际返回null时,您的可为null的int将被填充,如果有,则使用PermissionLevelId的实际值填充 .SingleOrDefault():
返回序列的唯一元素,如果
序列为空;如果存在更多异常,此方法将引发异常
序列中有多个元素
这里的问题是.SingleOrDefault()代码>调用返回了默认的“null”值。当您尝试对该空引用调用PermissionLevelID
时,会引发错误
您可以将其更改为:
serverPermisionLevel = tms.SecurityroleTypePermisions
.Where(a=>a.SecurityRoleID == RoleID)
.Where(a2=>a2.TechnologyType.Name.ToLower() == "server")
.Select(r => r.PermissionLevelID).SingleOrDefault();
这样,当.SingleOrDefault实际返回null时,您的可为null的int将被填充,如果有,则使用PermissionLevelId的实际值填充 哪一行给出了NRE?如果未找到值,则未选中使用SingleOrDefault
会给出空引用异常Single
将引发一个异常,即集合中没有匹配的元素,但是SingleOrDefault
将只返回null
,此时您正在尝试引用null
对象上的属性。换句话说,它可能不是您正在设置的属性,而是您从中设置它的表达式。实际上,该代码段的每一行都可能引发空引用异常。在SecurityRoleGroupAssign
中添加可为空的字段并不能防止类实例的构造出现错误。欢迎使用堆栈溢出!几乎所有NullReferenceException
的情况都是相同的。请参阅“”以获取一些提示。哪一行给出了NRE?如果未找到值,则未选中使用SingleOrDefault
会给出空引用异常Single
将引发一个异常,即集合中没有匹配的元素,但是SingleOrDefault
将只返回null
,此时您正在尝试引用null
对象上的属性。换句话说,它可能不是您正在设置的属性,而是您从中设置它的表达式。实际上,该代码段的每一行都可能引发空引用异常。在SecurityRoleGroupAssign
中添加可为空的字段并不能防止类实例的构造出现错误。欢迎使用堆栈溢出!几乎所有NullReferenceException
的情况都是相同的。有关提示,请参阅“”。