微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET MVC:一个或多个实体的验证失败有关详细信息,请参阅“EntityValidationErrors”属性

如何解决ASP.NET MVC:一个或多个实体的验证失败有关详细信息,请参阅“EntityValidationErrors”属性

我向我的用户添加一个新字段:“Name”(因为我看到 UserName 与电子邮件的值相同,所以我不想更改它)。由于某种原因,我无法在 Facebook 注册新用户。导致错误的行是“result = await UserManager.AddLoginAsync(useraux.Id,info.Login);”在ExternalLoginConfirmation中,所以我认为user.Id在将所有用户信息插入用户表之前可能没有值,所以我在用户放入表中后等待,然后我通过电子邮件选择它以获取其ID,但它仍然给我错误。当我从 Facebook 请求更多数据(用户名)时,我想我破坏了外部登录;为此,我不得不对代码进行一些更改。我向 ExternalLoginCallback 添加了以下行以获取名字:“var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;”

我的代码

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationviewmodel model,string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return RedirectToAction("Index","Manage");
            }

            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var info = await AuthenticationManager.GetExternalLoginInfoAsync();
                if (info == null)
                {
                    return View("ExternalLoginFailure");
                }

                var user = new ApplicationUser { UserName = model.Name,Email = model.Email,Name = model.Name};
                
                var result = await UserManager.CreateAsync(user);
                if (result.Succeeded)
                {
                    var useraux = await UserManager.FindByEmailAsync(model.Email);
                    result = await UserManager.AddLoginAsync(useraux.Id,info.Login);
                    if (result.Succeeded)
                    {
                        //--
                        //await StoreFacebookAuthToken(user);
                        await SignInManager.SignInAsync(user,isPersistent: false,rememberbrowser: false);
                        return RedirectToLocal(returnUrl);
                    }
                }
                AddErrors(result);
            }

            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }
[AllowAnonymous]
        public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
        {
            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
            var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;
            if (loginInfo == null)
            {
                return RedirectToAction("Login");
            }

            // Sign in the user with this external login provider if the user already has a login
            var result = await SignInManager.ExternalSignInAsync(loginInfo,isPersistent: false);
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.Requiresverification:
                    return RedirectToAction("SendCode",new { ReturnUrl = returnUrl,RememberMe = false });
                case SignInStatus.Failure:
                default:
                    // If the user does not have an account,then prompt the user to create an account
                    ViewBag.ReturnUrl = returnUrl;
                    ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                    return View("ExternalLoginConfirmation",new ExternalLoginConfirmationviewmodel { Email = loginInfo.Email,Name = firstName });
            }
        }

编辑:我添加了在 try-catch 块中带来错误的行,应该将错误写入控制台,例如“Console.WriteLine(”Entity of type“{0}” in state“{1} “有以下验证错误:”,“,我到底应该看什么?右键单击和“检查”打开的控制台中没有任何内容,Visual Studio 中也没有。但是,它以某种方式解决了我的问题,并且我不再收到错误消息。

解决方法

使用 DbEntityValidationException 查看错误详情

try
{
//...

var result = await UserManager.CreateAsync(user);

//...

}
catch(DbEntityValidationException ex) 
{
 foreach (var err in ex.ValidationErrors)
 {
   Console.WriteLine(err.ErrorMessage);
 }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。