如果新提交的值为null,则取消更新记录中的单个字段

时间:2017-10-13 15:34:17

标签: c# asp.net-mvc

我在“Manager”类中有一个简单的模型/控制器设置(在ASP.NET MVC中),其中包含有关客户端的信息,包括密码字段。我希望管理员记录的编辑表单仅在输入新密码时更新密码字段,而不是使用完整的单独控制器/视图来更新密码。 (假设是管理员类型的用户正在编辑管理员记录)。

在下面的代码中,我取出了其他字段的属性以节省空间......

public class Manager
{
    public int ManagerID { get; set; }
    public string ManagerName { get; set; }
    public string Phone1 { get; set; }
    public string Phone2 { get; set; }
    public string Email { get; set; }
    public string OrganizationName { get; set; }
    public string OrganizationType { get; set; }
    public string Notes { get; set; }
    public bool Active { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Update Password")]
    public string Password { get; set; }
}

My Manager View和ManagersController都具有默认生成的代码。 Edit方法定义是:

public async Task<IActionResult> Edit(int id, [Bind("ManagerID,ManagerName,Phone1,
    Phone2,Email,OrganizationName,OrganizationType,Notes,Active,Password")]
    Manager manager)
{
    .
    .
    .
    _context.Update(manager);
    await _context.SaveChangesAsync();
}

所以在这一点上,如果我将密码留空,它当然会用空值更新记录。我需要做两件事:1。检查以确保Password值不为null,并且2.如果它不为null,则允许它更新,否则在表中更新密码值,但是然后允许其余的字段要更新。

如您所见,密码字段已绑定。我想知道我是否需要手动绑定它,或者当它为null时取消绑定它,或者类定义中有什么东西可以帮助?...我只是不知道。

2 个答案:

答案 0 :(得分:1)

尝试使用好的ol&#39;支持领域。如果没有涉及逻辑,则自动属性很好,但在这种情况下,我认为在更新字段之前,如果传递的值是否为null,则可以执行以下操作:

private string password;

[DataType(DataType.Password)]
[Display(Name = "Update Password")]
public string Password 
{ 
    get
    {
        return password;
    }
    set
    {
        if (!string.IsNullOrEmpty(value))
        {
            password = value;
        }
    }
}

答案 1 :(得分:1)

我发现了另一个类似的问题,我从中得出了答案:

Field is updating with null value...

要处理的物业太多了! (我习惯了低级语言)。在保存数据的调用之前,如果密码为null,则将Password字段的IsModified属性设置为false。然后它不会更新数据库中的字段:

_context.Update(manager);

if (manager.Password == null)
{
    _context.Entry(manager).Property(x => x.Password).IsModified = false;
}

await _context.SaveChangesAsync();

我在这里只是一个菜鸟,但设置为IsModified的{​​{1}}必须在false命令之后才显得很重要。