繁体   English   中英

Linq Select语句需要帮助-使用FirstOrDefault之后的NullReferenceException

[英]Linq Select Statement help needed - NullReferenceException after using FirstOrDefault

我有一个处理登录过程的LINQ语句。 传递有效的用户名和密码组合时,它可以正常工作。 但是,当我对无效凭据进行测试时,在下面的行中会显示NullReferenceException错误,<<< ----------------在正确处理无效凭据方面需要帮助吗?

public int _accountID;
public int _securityLevelID;
public void GetLoginInfo(string EmailAddress, string Password)
{
    LoginItem l = null;

    {
        try
        {
            using (RootsDataContext RDC = new RootsDataContext())

                l = (from a in RDC.DBLogIns
                     where a.EmailAddress == EmailAddress
                     && a.Password == Password
                     && a.IsActive == 1

                     select new LoginItem
                     {
                         AccountIDFK = a.AccountIDFK,
                         SecurityLevelIDFK = a.SecurtityLevelIDFK,

                     }).FirstOrDefault();

            _accountID = (int)l.AccountIDFK;      <<<---------------- 
            _securityLevelID = (int)l.SecurityLevelIDFK;

            if (_accountID < 1 || _accountID == null)
            {
                lbl_LoginStatus.Text = "Invalid";
            }

        }


        catch (Exception ex)
        {
            string error = ex.Message;
        }


        if (_accountID > 0)
        {
            if (_accountID == 1 && _securityLevelID == 1) // [Quentin]   
            {
                Response.Redirect("~/AccountsMaster.aspx");
            }

            if (_accountID > 1 && _securityLevelID == 2) // [Companies]    
            {
                Response.Redirect("~/CompanyMaster.aspx");
            }

            if (_accountID > 1 && _securityLevelID == 3) // [Branch]
            {
                Response.Redirect("~/BranchMaster.Aspx");
            }

            if (_accountID > 1 && _securityLevelID == 4) // [Clients]   
            {
                Response.Redirect("~/Home.aspx");
            }
        }
    }
}    

通过说

  // ... 
  }).FirstOrDefault();

如果找到匹配项,则将获取DBLogIn对象;否则,将获取null

在访问属性AccountIDFKSecurityLevelIDFK之前,您需要检查null:

// ... }).FirstOrDefault();
if (l != null)
{
    _accountID = (int)l.AccountIDFK;
    _securityLevelID = (int)l.SecurityLevelIDFK;
}

需要考虑的其他几点:

  • 您不应该将密码直接存储在数据库中。 一种更安全的方法是将散列(并可能添加了盐)的密码存储在数据库中,然后找到用户(通过EmailAddress and Active = 1 ),然后比较用户键入的内容和存储在用户名中的哈希值。 D B。
  • 这段代码吞噬了异常 -这使诊断问题成为一场噩梦:

     catch (Exception ex) { string error = ex.Message; } 
  • 不要将字段设为公开public int _accountID; )-如果未在外部使用它们,则将它们设为私有;如果从您的类在外部可见,则将它们转换为(自动生成的)属性。

如果没有DBLogIn记录与您提供的条件匹配,则FirstOrDefault方法将返回null,因此您需要在访问(int)l.AccountIDFK之前首先检查l是否为null。 此外,它看起来像lbl_LoginStatus.Text = "Invalid"; 应该在l为null时完成,因此您需要删除if (_accountID < 1 || _accountID == null)块并按如下所示更改代码:

if (l != null)
{
    _accountID = (int)l.AccountIDFK;
    _securityLevelID = (int)l.SecurityLevelIDFK;
}
else
{
    // logic when l is null
    lbl_LoginStatus.Text = "Invalid";
}

或者,您也可以使用C#三元运算符检查l是否为null

_accountID = l != null ? (int)l.AccountIDFK : 0;
_securityLevelID = l != null ? (int)l.SecurityLevelIDFK : 0;

if (_accountID < 1)
{
    lbl_LoginStatus.Text = "Invalid";
}

使用前,应检查“ l”中的空值。

if(l!=null)
{
_accountID = (int)l.AccountIDFK;    
            _securityLevelID = (int)l.SecurityLevelIDFK;
}
else
{
 lbl_LoginStatus.Text = "Invalid";
}

如果列表中没有与您的查询匹配的项目,Linq FirstOrDefault将返回null。因此,如果您的代码中为null,则意味着用户登录无效。

  public int _accountID; public int _securityLevelID; public void GetLoginInfo(string EmailAddress, string Password) { LoginItem l = null; { try { using (RootsDataContext RDC = new RootsDataContext()) l = (from a in RDC.DBLogIns where a.EmailAddress == EmailAddress && a.Password == Password && a.IsActive == 1 select new LoginItem { AccountIDFK = a.AccountIDFK, SecurityLevelIDFK = a.SecurtityLevelIDFK, }).FirstOrDefault(); if(l==null || _accountID < 1 || _accountID == null) { lbl_LoginStatus.Text = "Invalid"; Response.Redirect("~/InvalidCredentials.aspx"); // redirect to invalid login page. } else { _accountID = (int)l.AccountIDFK; _securityLevelID = (int)l.SecurityLevelIDFK; } } catch (Exception ex) { string error = ex.Message; } if (_accountID > 0) { if (_accountID == 1 && _securityLevelID == 1) // [Quentin] { Response.Redirect("~/AccountsMaster.aspx"); } if (_accountID > 1 && _securityLevelID == 2) // [Companies] { Response.Redirect("~/CompanyMaster.aspx"); } if (_accountID > 1 && _securityLevelID == 3) // [Branch] { Response.Redirect("~/BranchMaster.Aspx"); } if (_accountID > 1 && _securityLevelID == 4) // [Clients] { Response.Redirect("~/Home.aspx"); } } } } 

您应该检查LoginItem的默认值null ,如果它为null(在无效凭据的情况下),则请执行任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM