Вход администратора и пользователя с использованием одной формы входа - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь выполнить вход с правами администратора и пользователя, используя одну форму входа. но я продолжаю получать ошибку «Последовательность не содержит элементов». Я использовал код ниже.

[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 голосов
/ 13 ноября 2018

Согласно Fixing LINQ Error: последовательность не содержит элементов , это исключение возникает при использовании 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():

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

// Admins
Session["AdminId"] = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email)?.AdminID;
0 голосов
/ 12 ноября 2018

Я думаю, что это связано с 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...