如何解决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 举报,一经查实,本站将立刻删除。