C# mvc5表单验证更新失败
我一直在做一个基于mvc5的项目。 我在模型类上应用了表单验证。比较条件应用于用户密码和用户密码确认。它在插入时非常有效。但是当我必须更新同一个客户端bt而不是密码的信息时,在这种情况下,我的MoldeStat.Valid是false,因为我认为这是因为密码上的比较条件 有人能告诉我如何解决这个问题吗? 我面临更新问题 提前谢谢你的帮助 我的模范班C# mvc5表单验证更新失败,c#,validation,passwords,asp.net-mvc-5,C#,Validation,Passwords,Asp.net Mvc 5,我一直在做一个基于mvc5的项目。 我在模型类上应用了表单验证。比较条件应用于用户密码和用户密码确认。它在插入时非常有效。但是当我必须更新同一个客户端bt而不是密码的信息时,在这种情况下,我的MoldeStat.Valid是false,因为我认为这是因为密码上的比较条件 有人能告诉我如何解决这个问题吗? 我面临更新问题 提前谢谢你的帮助 我的模范班 [Required(ErrorMessage = "*")] public string User_Password { get;
[Required(ErrorMessage = "*")]
public string User_Password { get; set; }
[Compare("User_Password")]
[Required(ErrorMessage = "*")]
public string User_Password_Confirm { get; set; }enter code here
我的控制器类
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit2([Bind(Include = "User_Id,User_Nom,User_Prenom,User_Email,User_Telephone,User_Role,User_Password,User_Password_Confirm,UserCreationDate,User_Status")] User user)
{
if (ModelState.IsValid)
{
//db.Entry(user).State = EntityState.Modified;
//db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.User_Status = new SelectList(db.Account_Status, "Account_Status_ID", "Account_Status_Nom", user.User_Status);
ViewBag.User_Role = new SelectList(db.Role, "Role_Id", "Role_Name", user.User_Role);
return View("edit");
}
“仅插入密码”部分的视图。在这里,我试图设置User\u Password\u confirm=User\u Password的值,但失败了:
<div class="form-group">
@Html.LabelFor(model => model.User_Password, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.User_Password)
@Html.ValidationMessageFor(model => model.User_Password)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.User_Password_Confirm, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.User_Password_Confirm, new { @Value = Model.User_Password })
@Html.ValidationMessageFor(model => model.User_Password_Confirm)
</div>
</div>
通过插入
@Html.ValidationSummary
在你看来 首先,我建议您创建两个不同的模型:例如UserCreateModel和UserUpdateModel 那么你的代码将包含一些安全漏洞。 如果我是用户Id 275,我可以更改表单中的用户Id,即使它是隐藏的,这样我就可以更改任何用户的电子邮件、密码、名字和姓氏 您需要做的是获取已登录用户的Id,并仅更改已更改的数据
if (ModelState.IsValid)
{
var userfromDb = db.Users.Find(loggedUser.EmployeeId);
userfromDb .Email = user.Email;//etc...
db.SaveChanges();
return RedirectToAction("Index");
}
您可以做的第一件事是ModelState.Values.SelectManyx=>x.Errors.AggregateString.Empty,current,error=>current+error.ErrorMessage+\n;在模型中显示所有错误:我认为错误是明确的。请参阅在Isnert时我有两个字段password和confirm password确认password不在from数据库表中。因此,我的模型可以比较这两个领域的附加值。但在更新时,我没有显示密码。所以默认情况下,确认密码的值为空。是的,我知道。但问题是当我更新表的内容时。实际上,confirm_password只是我在其nt模型中从数据库创建的一个属性。当我向表中插入数据时,它工作得很好,但当我在表中更新相同的数据时,我会遇到一个错误,因为confirm password的值自动为null。因此,当Modelstate验证确认操作时,它会自动变为false:希望现在稍微清楚一点,我想这是唯一的可能性。我只是不想创建第二个模型。或者我认为我应该从模型类中的密码中删除[compare]和[required]验证,并在更新时对其进行检查。例如:ifModelState.IsValid&&password==conformPassword{action}。你怎么说?你能做到,但不是最优的。您仍然需要更改db.Entryuser.State=EntityState.Modified;出于安全原因。我仍然建议您拥有两个模型^^拥有两个模型不需要太多时间,如果您有动力,您甚至可以为模型的公共部分使用一些传统,而且它的使用确实比硬编码更好。