Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 可为Null的对象上出现Null异常<;int>;_Asp.net_Asp.net Mvc - Fatal编程技术网

Asp.net 可为Null的对象上出现Null异常<;int>;

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

我的asp.net mvc web应用程序中有以下模型类:

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
的情况都是相同的。有关提示,请参阅“”。