MVC linq查询处理情况,其中序列不包含任何元素

时间:2015-10-09 14:27:45

标签: asp.net-mvc linq

我的mvc应用程序上有一个简单的登录表单,除了当您尝试使用不在数据库中的用户登录时,它才能正常工作。

它将抛出一个错误Sequence contains no elements,这是有道理的,因为数据库中没有匹配的用户,尽管我尝试在它没有执行的代码中处理它。

    // POST: Login User
    [HttpPost]
    public ActionResult Login(UserAccount user)
    {

        using (MyDbContext db = new MyDbContext())
        {
            var usr = db.Users.Single(u => u.UserName == user.UserName && u.UserPassword == UserPassword);
            if (usr != null)
            {
                Session["UserID"] = usr.UserId.ToString();
                Session["Username"] = usr.UserName.ToString();
                return RedirectToAction("LoggedIn");
            }
            else
            {
                ModelState.AddModelError("", "Username or Password Incorrect");
            }
        }
        return View();
    }

2 个答案:

答案 0 :(得分:3)

如果找不到匹配项,

Single将抛出异常,或者找到太多匹配项。在没有找到匹配项的情况下,使用SingleOrDefault之类的方法会返回null:

var usr = db.Users.SingleOrDefault(...)

这会让你为之后正在进行的空检查做好准备。

答案 1 :(得分:1)

所以......正如有些人在上面的评论中所说,你可以简单地使用以下查询,然后进行空检查:

var usr = db.Users.SingleOrDefault(u => u.UserName == user.UserName && u.UserPassword == UserPassword);

话虽这么说,我建议使用内置的ASP Identity框架进行身份验证和授权 - 除非您需要为您的应用程序定制实现,否则您可以避免大量测试(和潜在的错误)以及获取一大堆很酷的开箱即用功能。我建议您查看the resources here以获取更多信息。