【发布时间】:2021-09-06 08:52:39
【问题描述】:
我有一个关于在我的 ASP.NET 身份应用程序中更新指定用户数据的问题。我有一个模型,它定义了创建、删除和更新用户的属性和一个控制器。在控制器中,我有一个方法 public async Task<IActionResult> EditRole(string id) 可以编辑选定用户的详细信息。数据仅在以下情况下更新:
-更新所有数据
-仅更新电子邮件
-用电子邮件更新一个至少一个值
当我尝试更新电子邮件以外的其他内容时,CustomUserValidator 类会出现异常,该类负责在创建帐户时验证用户的详细信息。
异常消息是System.NullReferenceException: „Object reference not set to an instance of an object.” Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.get returned null.
以下是需要查看的详细信息:
模型 UserModel.cs:
using UserApp.Models;
using System.ComponentModel.DataAnnotations;
namespace UserApp
{
public class EditUserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
}
控制器 AdminController.cs :
using UserApp.Database;
using UserApp.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace UserApp.Controllers
{
[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
private readonly UserManager<UserEntity> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public AdminController(UserManager<UserEntity> userManager, RoleManager<IdentityRole> roleManager)
{
this._userManager = userManager;
this._roleManager = roleManager;
}
//Views
public IActionResult EditUser() => View();
[HttpPost]
public async Task<IActionResult> EditUser(EditUserModel editUserModel,string id)
{
var user = await _userManager.FindByIdAsync(id);
if (user != null)
{
user.FirstName = editUserModel.FirstName;
user.LastName = editUserModel.LastName;
user.Email = editUserModel.Email;
var result = await _userManager.UpdateAsync(user);
if (result.Succeeded)
{
return RedirectToAction("Account");
}
else
{
AddErrorsFromResult(result);
}
}
else
{
ModelState.AddModelError("", "User not existing");
}
return View("Account", _userManager.Users);
}
}
查看 EditUser.cshtml:
@model EditUserModel
@{
Layout = "_Layout";
}
<h1>User update</h1>
<div asp-validation-summary="All" class="text-danger"></div>
<div class="row-edit">
<form asp-action="EditUser" method="post">
<p>First Name</p>
<input class="register form-control" asp-for="FirstName" />
<p>Last Name</p>
<input class="register form-control" asp-for="LastName" />
<p>Email</p>
<input class="register form-control" asp-for="Email" />
<br />
<input type="submit" value="Save" class="btn btn-primary" />
@* @foreach (var role in Model.RoleModel.Role)
{
<table>
<tr>
<td>@role.Name</td>
</tr>
</table>
}*@
</form>
</div>
CustomUserValidator.cs
using UserApp.Database;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace UserApp.Infrastructure
{
public class CustomUserValidator : UserValidator<UserEntity>
{
public override async Task<IdentityResult> ValidateAsync(UserManager<UserEntity> manager, UserEntity user)
{
IdentityResult result = await base.ValidateAsync(manager, user);
List<IdentityError> errors = result.Succeeded ? new List<IdentityError>() : result.Errors.ToList();
List<string> domain = new();
string[] domains = { "@tvp.pl", "@edu.co.uk"};
domain.AddRange(domains);
int addError = 0;
foreach(var check in domain) if(!user.Email.ToLower().EndsWith(check)) addError++;
if(addError == domain.Count)
{
errors.Add(new IdentityError
{
Code = "EmailDomainError",
Description = "Invalid email domain"
});
}
return errors.Count == 0 ? IdentityResult.Success : IdentityResult.Failed(errors.ToArray());
}
}
}
【问题讨论】:
-
您的问题对我来说似乎不清楚...那么您可以更新用户的电子邮件地址吗?
-
如果不提供电子邮件,我将无法更新其他值。例如:我只想更新名字,但我不能。
标签: asp.net-mvc asp.net-core asp.net-identity