【问题标题】:mvc5 form validation update failedmvc5 表单验证更新失败
【发布时间】:2014-11-01 21:38:06
【问题描述】:

我一直在做一个基于 mvc5 的项目。 我在我的模型类上应用了表单验证。 “比较”条件适用于 User_password 和 User_Password_Confirm。它在插入时完美运行。但是当我必须更新同一客户端 bt 的信息而不是密码时,在这种情况下,我的 MoldeStat.Valid 为“假”,因为我认为这是因为密码的“比较”条件。

谁能告诉我如何解决这个问题? 我遇到了“更新”的问题。

提前感谢您的帮助

我的模型类

    [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_Password_confirm = User_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>

【问题讨论】:

  • 您可以做的第一件事是 ModelState.Values.SelectMany(x => x.Errors).Aggregate(String.Empty, (current, error) => current + (error.ErrorMessage + "\ n"));在模型中显示所有错误:)
  • 我认为错误很明显。请参阅“Isnert”时,我有两个字段“密码”和“确认密码”(确认密码不在数据库表中)。所以我的模型可以比较两个领域的附加值。但是在更新时,我不显示密码。所以默认情况下“确认密码”的值为空。

标签: c# validation passwords asp.net-mvc-5


【解决方案1】:

首先,我建议您创建两个不同的模型:例如 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");
    }

【讨论】:

  • 是的,我想这是唯一的可能性。我只是不想创建第二个模型。或者我认为我应该从模型类中的密码中删除 [compare] 和 [required] 验证,并在更新时检查它。例如:if((ModelState.IsValid) && password == conformPassword){action}。你说什么??
  • 您可以这样做,但不是最佳的。您仍然必须更改 db.Entry(user).State = EntityState.Modified;出于安全原因。我仍然建议你拥有两个模型 ^^ 拥有两个模型并不需要太多时间(如果你有动力,你甚至可以为模型的公共部分使用一些遗产),它确实比硬编码更好。
【解决方案2】:

您可以通过插入

轻松查看所有模型验证错误的摘要
@Html.ValidationSummary

在你看来。

【讨论】:

  • 是的,我知道。但问题是当我更新表格的内容时。实际上,confirm_password 只是我在从数据库中对其 nt 建模时创建的一个属性。当我将数据插入表时它工作得很好但是当我更新相同的数据时我会遇到一个错误,因为自动确认密码的值为空。当 Modelstate 验证确认操作时,它会自动变为错误 :( 希望现在有点清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多