C# 编辑管线重置多选选项
我有一个剃须刀模板,如下所示:C# 编辑管线重置多选选项,c#,asp.net,razor,C#,Asp.net,Razor,我有一个剃须刀模板,如下所示: <div class="form-group"> @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorF
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", placeholder = "Edit Password", value="" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Roles, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("Roles", (MultiSelectList)ViewBag.UserRoles, new { multiple = "multiple" })
</div>
</div>
var roles = new List<string>
{
"Admin",
"User",
"Moderator"
};
var currentRoles = _ctx.Users.First(a => a.Id == id).Roles;
var rolesList = JsonConvert.DeserializeObject<IEnumerable<string>>(currentRoles);
ViewBag.UserRoles = new MultiSelectList(roles, rolesList);
return View();
当我加载此视图时,get路径按预期工作,并且multiselect会正常填充。如果我编辑了密码并通过了验证,它将按预期工作。但是,特别是当密码未通过正则表达式时,multiselect将重置为仅在视图中选择的第一个选项。如果我将此发布到DB,它将覆盖角色
尽管在控制器中捕获模型视图并重置视图,但有人知道为什么要重置模型视图吗
var existingUser = _ctx.Users.First(a => a.Id == id);
if (!ModelState.IsValid)
{
var roles = new List<string>
{
"Admin",
"User",
"Moderator"
};
var currentRoles = existingUser.Roles;
var rolesList = JsonConvert.DeserializeObject<IEnumerable<string>>(currentRoles);
ViewBag.UserRoles = new MultiSelectList(roles, rolesList);
return View();
}
if (model.Password != null)
{
var hashedPassword = Utils.ComputeHash(model.Password, "SHA256", null);
existingUser.Password = hashedPassword;
}
if (model.Roles != null)
{
existingUser.Roles = JsonConvert.SerializeObject(model.Roles);
}
_ctx.SaveChanges();
return Redirect(Url.Action("index", "Users"));
[RegularExpression(@"(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d!$%+&@#^_\-+= *?&]{16,}", ErrorMessage = "Password must be a minimum of 16 characters, contain at least 1 number, 1 lowercase, 1 uppercase, and 1 special")]
public string Password { get; set; }
public string[] Roles { get; set; }