Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# mvc5表单验证更新失败_C#_Validation_Passwords_Asp.net Mvc 5 - Fatal编程技术网

C# mvc5表单验证更新失败

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;

我一直在做一个基于mvc5的项目。 我在模型类上应用了表单验证。比较条件应用于用户密码和用户密码确认。它在插入时非常有效。但是当我必须更新同一个客户端bt而不是密码的信息时,在这种情况下,我的MoldeStat.Valid是false,因为我认为这是因为密码上的比较条件

有人能告诉我如何解决这个问题吗? 我面临更新问题

提前谢谢你的帮助

我的模范班

    [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;出于安全原因。我仍然建议您拥有两个模型^^拥有两个模型不需要太多时间,如果您有动力,您甚至可以为模型的公共部分使用一些传统,而且它的使用确实比硬编码更好。