具有修改值的TryUpdateModelAsync

时间:2018-12-07 15:31:12

标签: c# asp.net-core asp.net-core-mvc

我使用模型绑定更新数据库,如下所示:

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

在您的示例中,对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,因为它现在是多余的-在调用{{1}之前,显式赋值中覆盖的任何设置都被覆盖}。

答案 1 :(得分:1)

您是否可以尝试添加新行(在TryUpdateModelAsync的正上方)

adminUpdate.Password = password;
if (await TryUpdateModelAsync(
    adminUpdate,