【发布时间】:2020-07-31 16:29:51
【问题描述】:
考虑这个模型和视图模型:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
public class PersonViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
只编辑电子邮件的表单:
<form asp-action="UpdateEmail">
<input type="hidden" asp-for="Id" />
<label asp-for="Email"></label>
<input asp-for="Email" />
<button type="submit">Update e-mail address</button>
</form>
还有UpdateEmail() POST 控制器方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateEmail(int id, [Bind("Id,Email")] Person person)
{
if (id != person.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
db.Update(person);
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
// ... stuff
}
return RedirectToAction("Details", new { id = person.Id });
}
return View(auto.Map<PersonViewModel>(person));
}
根据我的经验,在这种情况下,除Email 之外的所有其他属性都将被NULL 值覆盖。我真的必须将它们添加为表单中的隐藏字段吗?如果是这样,那么使用[Bind("Id,Email")] 的意义何在?
【问题讨论】:
-
个人所有其他字段将具有默认值。您希望知道一个属性的默认值是否是已更改的值,以及哪个是未更改且不应保留的值?
-
@SirRufo 我希望可以将除已编辑属性之外的所有其他属性的值保留在数据库中。
-
db 上下文应该如何知道 phone 属性的 null 值是一个标志。在这种情况下不更改该属性,但在任何其他情况下应将其更改为 null?
-
@SirRufo 我认为这是
[Bind("PropertyName")]的目的——上下文只会替换指定属性的值。 -
但这与数据库上下文或 EF 完全没有关系。
标签: c# asp.net-core-mvc model-binding