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; }