我用这样的模型绑定更新数据库:

var adminUpdate = await _context.Admins.FindAsync(Id);

if (!String.IsNullOrEmpty(Password)) {
    if (Password != PasswordCheck) {
        ModelState.AddModelError("Password", "Passwords do not match");
    } else {
        byte[] data = Encoding.UTF8.GetBytes(Password + Configuration["SomeLocation:SomeKey"]);
        data = SHA512.Create().ComputeHash(data);
        password = Convert.ToBase64String(data);
    }
} else {
    password = adminUpdate.Password;
}

if (!ModelState.IsValid) {
    return Page();
}

if (await TryUpdateModelAsync(
    adminUpdate,
    "",
    a => a.FirstName,
    a => a.LastName,
    a => a.Email,
    a => a.Password, // must be the value of "password"
    a => a.Status,
    a => a.CompanyId
    ))
{
    await _context.SaveChangesAsync();
    return Redirect("/admin");
}


我的问题是,我需要在数据库密码字段而不是a.Password中插入“ password”变量。

我怎样才能做到这一点?

最佳答案

在您的示例中,对TryUpdateModelAsync的调用最终根据adminUpdate中的值在您的ModelState实例上设置属性。如果要为Password设置另一个值,可以在调用TryUpdateModelAsync之后进行设置,如下所示:

if (await TryUpdateModelAsync(
    adminUpdate,
    "",
    a => a.FirstName,
    a => a.LastName,
    a => a.Email,
    a => a.Status,
    a => a.CompanyId
    ))
{
    adminUpdate.Password = password;
    await _context.SaveChangesAsync();
    return Redirect("/admin");
}


在上面的示例中,我还从a => a.Password中删除​​了TryUpdateModelAsync,因为它现在是多余的-在调用SaveChangesAsync之前,显式赋值中覆盖的任何设置都将被覆盖。

关于c# - 具有更新值的TryUpdateModelAsync,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53672503/

10-12 19:43