2015-10-09 63 views
0

我在我的mvc應用程序上有一個簡單的登錄窗體,除了當您嘗試使用不在數據庫中的用戶登錄時,它能正常工作。MVC linq查詢句柄其中序列不包含任何元素的情況

它會拋出一個錯誤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(); 
    } 
+3

你試過'SingleOrDefault'嗎? –

+0

對不起,我仍然在學習linq,只是在查詢結束時拋出它? –

+2

不是'Single',而是使用'SingleOrDefault' –

回答

3

Single如果找不到匹配項,或者找不到太多,則會拋出異常。使用SingleOrDefault像這樣返回的情況下,空在那裏沒有發現匹配:

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

此設置你的空檢查你正在做正確的之後。

1

所以......至於有些人說,上述意見,你可以只是簡單使用下面的查詢,然後做你的空檢查:

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

話雖這麼說,我會建議考慮使用內置用於身份驗證和授權的ASP身份框架 - 除非您需要爲您的應用程序定製實現,否則您可以避免大量測試(以及潛在的錯誤)以及獲得大量即用即用功能。我建議您查看the resources here瞭解更多信息。

相關問題