MVC电子邮件确认(序列包含多个元素)

时间:2016-04-14 10:26:40

标签: asp.net-mvc asp.net-mvc-4

我目前正在尝试向我的网站添加电子邮件确认,我遇到了一些问题。

我可以成功注册一个帐户,注册后,confirmToken会被放入我的数据库中,并且会发送一封电子邮件,其中包含查询字符串链接:http://www.example.com/RegistrationConfirmation?9ZPwZZrO-UmdpVpxXWjmRw当转到此链接时,控制器操作RegistrationConfirmation被调用,方法ConfirmAccount查询是否可以找到具有在网址中传递的确认令牌的用户。

调试时,我在此行中收到错误“序列包含多个元素”:Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);

我不确定会出现什么问题,因为令牌是唯一的,并且数据库中没有重复的令牌。

注册HttpPost:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterModel model)
    {
        string confirmationToken = CreateToken();
        Account account = new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken);
        if (DatabaseHandler.isUsernameDuplicate(account.Username))
        {
            // is duplicate // provide notification
        }
        else
        {
            Session["accountID"] = Repository.InsertAccount(new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email,false, confirmationToken));

            // Email Logic
            try
            {
                await client.SendMailAsync(message);
            }
            catch (Exception e)
            {
                ModelState.AddModelError("", "Problem sending email: " + e.Message);
            }
            return View("ConfirmEmail");
        }
        return View();
    }

RegistrationConfirmation HttpGet:

[HttpGet]
    [AllowAnonymous]
    public ActionResult RegisterConfirmation(string Id)
    {
        if (ConfirmAccount(Id))
        {
            return RedirectToAction("ConfirmationSuccess");
        }
        return RedirectToAction("ConfirmationFailure");
    }

ConfirmAccount方法:

private bool ConfirmAccount(string confirmationToken)
    {
        RecipeDbContext context = new RecipeDbContext();
        Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);
        if (user != null)
        {
            user.IsConfirmed = true;
            DbSet<Account> dbSet = context.Set<Account>();
            dbSet.Attach(user);
            context.Entry(user).State = EntityState.Modified;
            context.SaveChanges();

            return true;
        }
        return false;
    }

2 个答案:

答案 0 :(得分:0)

删除SingleorDefault()并检查结果..您将知道它不重复,如果您想避免此错误,请使用FirstorDefault()。

答案 1 :(得分:0)

原来查询本身没有错,RegisterConfirmation HttpGet似乎没有得到confirmToken值,所以我添加了#34; Id = Request.QueryString.ToString();&#34;现在一切都很完美:)