使用一种登录表单登录管理员和用户

时间:2018-11-12 13:36:29

标签: c# asp.net-mvc asp.net-mvc-5

我正在尝试使用一种登录表单进行管理员和用户登录。但我一直收到错误消息“序列不包含任何元素”。我使用了下面的代码。

[HttpPost]
public ActionResult Login(CustomerAccount user, Admin admnLogin)
{
   using (ProjDbContext db = new ProjDbContext())
    {
        var usr = db.CustomerAccounts.Single(u => u.Email == user.Email && u.Password == user.Password);
        var admn = db.CustomerAccounts.Single(u => u.Email == admnLogin.Email && u.Password == admnLogin.Password);

        if (usr != null)
        {
           Session["CustId"] = db.CustomerAccounts.Single(x => x.Email == user.Email).CustId;
           Session["Email"] = usr.Email.ToString();
            return RedirectToAction("TicketForm");

        } 
        else if (admn != null)
        {
            Session["AdminId"] = db.Admins.Single(x => x.Email == admnLogin.Email).AdminID;
            Session["Email"] = usr.Email.ToString();
            return RedirectToAction("AdminPanel");

        }            
        else
        {
            ModelState.AddModelError("", "Email or Password is wrong.");
        }
    }
    return View();
}

任何人都可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我认为它与LINQ有关,通常会看到此错误,因为您使用的是First()或Single()命令,而不是FirstOrDefault()和SingleOrDefault()。

示例:

Session [“ CustId”] = db.CustomerAccounts.SingleOrDefault(x => x.Email == user.Email).CustId;

Session [“ AdminId”] = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email).AdminID;

答案 1 :(得分:0)

根据Fixing LINQ Error: Sequence contains no elements,使用包含空数据的First()Single()时会发生此异常。解决此异常的常用方法是使用FirstOrDefault()SingleOrDefault()DefaultIfEmpty(),但请注意,使用FirstOrDefault()SingleOrDefault()时引用对象包含空值并且应该在访问其中的任何成员之前进行检查。

因此,应像下面的示例一样检查空值对会话变量的分配:

// Customers
var cust = db.CustomerAccounts.Single(x => x.Email == user.Email);

if (cust != null)
{
   Session["CustId"] = cust.CustId;
}

// Admins
var admin = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email);

if (admin != null)
{
   Session["AdminId"] = admin.AdminID;
}

对于C#6及更高版本,在SingleOrDefault()之后访问属性成员时,可以使用null-conditional operator

// Customers
Session["CustId"] = db.CustomerAccounts.SingleOrDefault(x => x.Email == user.Email)?.CustId;

// Admins
Session["AdminId"] = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email)?.AdminID;
相关问题