【发布时间】:2020-11-17 03:15:26
【问题描述】:
我希望用户能够从 MultiSelectList 下拉列表中选择多个技能。我能够将每个用户的多个技能选择保存到数据库中,但我发现如果我删除一个用户的技能选项,并且我使用之前在他的选择中保存了相同技能的不同用户登录,它会已为此用户和所有其他保存了类似技能选项的用户删除。
所以我很清楚。假设用户 A 保存了这些技能 [“C#”、“Python”、“Java”]。用户 B 当前保存的技能是 ["C++","Scala"]。用户 B 然后登录并决定添加他刚刚学习的 C#。一旦他更新了他的个人资料并且他的选择变成了这个[“C++”,“Scala”,“C#”]。 C# 会从用户 A 的选择中删除,因此它变为 ["Python", "Java"]。
这是我自定义的IdentityUser 类。
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
Skills = new List<Skill>();
}
public string Location { get; set; }
public virtual ICollection<Skill> Skills { get; set; }
}
这是技能模型。
public class Skill
{
public int SkillId { get; set; }
public string SkillType { get; set; }
}
这就是我在控制器中保存技能选择的方式。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Profile(ProfileViewModel profileModel)
{
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
if (ModelState.IsValid)
{
if (user.Location != profileModel.Location) user.Location = profileModel.Location;
if (profileModel.SelectedSkillIds != null)
{
List<Skill> tempSkills = new List<Skill> { };
foreach (var skillID in profileModel.SelectedSkillIds)
{
user.Skills.Add(_context.Skills.FirstOrDefault(x => x.SkillId == skillID));
var skill = _context.Skills.Find(skillID);
if (skill != null)
{
user.Skills.Add(skill);
tempSkills.Add(skill);
}
var allSkills = _context.Skills.ToList();
var skillsToRemove = allSkills.Except(tempSkills);
foreach (var sk in skillsToRemove)
{
user.Skills.Remove(sk);
}
}
await _userManager.UpdateAsync(user);
await _signInManager.RefreshSignInAsync(user);
return RedirectToAction("Profile", "Account");
}
return View(profileModel);
}
}
更新 - 我如何删除选择
if (profileModel.SelectedSkillIds != null)
{
List<UserSkill> tempSkills = new List<UserSkill> { };
foreach (var skillID in profileModel.SelectedSkillIds)
{
var skill = _context.Skills.Find(skillID);
if (skill != null)
{
var userskill = new UserSkill { AppUserId = user.Id, SkillId = skill.SkillId };
user.UserSkills.Add(userskill);
tempSkills.Add(userskill);
}
var allSkills = _context.UserSkills.ToList();
var skillsToRemove = allSkills.Except(tempSkills);
foreach (var sk in skillsToRemove)
{
user.UserSkills.Remove(sk);
}
}
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-core asp.net-mvc-4