C# 正在使用Asp.Net标识更新用户-存在用户名
我在Asp.net身份和更新用户方面有点困难。当我运行下面的代码时,success是false,错误消息是用户名为的用户存在。当然,这是显而易见的,因为您正在更新用户,而不是创建新用户 我试图删除用户名但没有成功,然后我被告知用户名(我相信它的意思是用户名)不能为空。 下面是一段代码C# 正在使用Asp.Net标识更新用户-存在用户名,c#,asp.net,C#,Asp.net,我在Asp.net身份和更新用户方面有点困难。当我运行下面的代码时,success是false,错误消息是用户名为的用户存在。当然,这是显而易见的,因为您正在更新用户,而不是创建新用户 我试图删除用户名但没有成功,然后我被告知用户名(我相信它的意思是用户名)不能为空。 下面是一段代码 public async Task<ActionResult> Edit(RegisterViewModel model) { var user = new User()
public async Task<ActionResult> Edit(RegisterViewModel model)
{
var user = new User()
{
UserName = model.UserName, FirstName = model.FirstName, LastName = model.LastName, Email = model.EmailAddress,
ApplicationId = Utilities.ApplicationUtilities.GetApplicationId()
};
var userContext = new ApplicationDbContext();
var userStore = new UserStore<User>(userContext);
var userManager = new UserManager<User>(userStore);
var result = await userManager.UpdateAsync(user);
if (result.Succeeded)
{
var selectedRole = model.SelectedRole;
if (!userManager.IsInRole(user.Id, selectedRole.Id))
{
// We are removing the user from the old role. He / she cannot have two or more roles
userManager.RemoveFromRole(user.Id, model.OldRole);
// Now we are adding the user to the new role
userManager.AddToRole(user.Id, selectedRole.Id);
userManager.Update(user);
}
userContext.SaveChanges();
// await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "UserManager");
}
公共异步任务编辑(RegisterViewModel模型)
{
var user=新用户()
{
UserName=model.UserName,FirstName=model.FirstName,LastName=model.LastName,Email=model.EmailAddress,
ApplicationId=Utilities.ApplicationUtilities.GetApplicationId()
};
var userContext=new ApplicationDbContext();
var userStore=新的userStore(userContext);
var userManager=newusermanager(userStore);
var result=await userManager.UpdateAsync(用户);
if(result.successed)
{
var selectedRole=model.selectedRole;
如果(!userManager.IsInRole(user.Id,selectedRole.Id))
{
//我们正在从旧角色中删除该用户。他/她不能有两个或多个角色
userManager.RemoveFromRole(user.Id,model.OldRole);
//现在我们将用户添加到新角色中
userManager.AddToRole(user.Id,selectedRole.Id);
userManager.Update(用户);
}
userContext.SaveChanges();
//等待信号同步(用户,ispersist:false);
返回重定向到操作(“索引”、“用户管理器”);
}
基于Jonesy输入的解决方案如下:
/*
* Some more information /Just in case someone else does the same
* mistakes I did...
*/
model.OldRole = "User"; // Name of old role - not ID of old role
model.SelectedRoleId = "Administrator"; // Name of new role, not ID of new role
// This test is here just to check if the model is valid or not
// By adding this part, you can check what is possibly wrong with your model
if (!ModelState.IsValid)
{
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new {x.Key, x.Value.Errors})
.ToArray();
}
// Creating the ApplicationDbContext object
var userContext = new ApplicationDbContext();
// Getting the list of users (I tried using Find here, but got errors)
var userList = userContext.Users.ToList();
// Decided to use First or Default. You also have to use double
// equal-characters(=) otherwise you will get errors
var user = userList.FirstOrDefault(u => u.UserName == model.UserName);
// Checking that we really found the user to update
if (user != null)
{
// populate the user object
user.UserId = model.UserId;
user.FirstName = model.FirstName;
user.LastName = model.LastName;
user.Email = model.EmailAddress;
}
// creating the UserStore object
var userStore = new UserStore<User>(userContext);
// ... and the userManager object
var userManager = new UserManager<User>(userStore);
// Do the update - I believe this is on the userManager-object
// and not in the database
var result = await userManager.UpdateAsync(user);
// If we get an error, we return to list of Users
// (You should log the error and also return the user to the form)
if (!result.Succeeded) return RedirectToAction("Index", "UserManager");
// Do the actual update in the database
userContext.SaveChanges();
// If the old role and the selected role is the same, we don't
// have to update
if (model.OldRole == model.SelectedRoleId) return RedirectToAction("Index", "UserManager");
// Get the selected role (sort of not needed, but here for clarity)
string selectedRole = model.SelectedRoleId;
// We are removing the user from the old role.
// In our application a user cannot have two or more roles
userManager.RemoveFromRole<User, string>(user.UserId, model.OldRole);
// Now we are adding the user to the new role
userManager.AddToRole<User, string>(user.UserId, selectedRole);
// We are updating the userManager-object
userManager.Update(user);
// And storing the information in the database
userContext.SaveChanges();
// Returning the user to the list of users
return RedirectToAction("Index", "UserManager");
/*
*更多信息/以防其他人也这样做
*我犯的错误。。。
*/
model.OldRole=“User”;//旧角色的名称-不是旧角色的ID
model.SelectedRoleId=“Administrator”//新角色的名称,而不是新角色的ID
//此测试仅用于检查模型是否有效
//通过添加此部分,您可以检查您的模型可能存在的问题
如果(!ModelState.IsValid)
{
var errors=ModelState
.其中(x=>x.Value.Errors.Count>0)
.Select(x=>new{x.Key,x.Value.Errors})
.ToArray();
}
//创建ApplicationDbContext对象
var userContext=new ApplicationDbContext();
//获取用户列表(我尝试使用Find here,但出现错误)
var userList=userContext.Users.ToList();
//决定使用First或Default。您还必须使用double
//相等字符(=),否则将出现错误
var user=userList.FirstOrDefault(u=>u.UserName==model.UserName);
//正在检查是否确实找到要更新的用户
如果(用户!=null)
{
//填充用户对象
user.UserId=model.UserId;
user.FirstName=model.FirstName;
user.LastName=model.LastName;
user.Email=model.EmailAddress;
}
//创建UserStore对象
var userStore=新的userStore(userContext);
//…和userManager对象
var userManager=newusermanager(userStore);
//进行更新-我相信这是在userManager对象上
//而不是在数据库中
var result=await userManager.UpdateAsync(用户);
//如果出现错误,我们将返回用户列表
//(您应该记录错误并将用户返回表单)
如果(!result.successed)返回RedirectToAction(“索引”、“用户管理器”);
//在数据库中执行实际更新
userContext.SaveChanges();
//如果旧角色和所选角色相同,则我们不会
//必须更新
如果(model.OldRole==model.SelectedRoleId)返回RedirectToAction(“索引”、“用户管理器”);
//获取所选角色(有点不需要,但为了清晰起见,请参见此处)
字符串selectedRole=model.SelectedRoleId;
//我们正在从旧角色中删除该用户。
//在我们的应用程序中,用户不能有两个或多个角色
userManager.RemoveFromRole(user.UserId,model.OldRole);
//现在我们将用户添加到新角色中
userManager.AddToRole(user.UserId,selectedRole);
//我们正在更新userManager对象
userManager.Update(用户);
//并将信息存储在数据库中
userContext.SaveChanges();
//将用户返回到用户列表
返回重定向到操作(“索引”、“用户管理器”);
使用dbContext来拉用户进行更新,而不是创建一个新的:
var user = userContext.Find(model.UserName);
或者你可能需要
var user = userContext.FirstOrDefault(u => u.UserName = model.UserName && u.Email = model.EmailAddress);
if(user != null)
{
//update user
}
这是一个旧的,但只是想发布我的解决方案,以相同的更新问题
var user = UserManager.FindByEmail(model.Email);
user.Address = model.Address;
user.City = model.City;
user.State = model.State;
var result = await UserManager.UpdateAsync(user);
您还可以管理角色
user.Roles.Add(Role);
user.Roles.Remove(Role);
谢谢你为我指明了正确的方向Jonesy。你是对的。我正在创建一个新对象,而不是查找要更新的对象。对于许多用户,你会遇到性能问题。在FirstOrDefault()之前不要执行ToList(),这完全浪费了服务器和数据库上的资源。您会将所有用户放入内存,然后进行筛选。如果您这样做:userContext.users.FirstOrDefault(u=>u.UserName==model.UserName);您的数据库将为您进行筛选。avar user=UserManager.FindById(user.Identity.GetUserId());可用于代替FindMyMail