我正在使用asp.net core 2.0 mvc编写应用程序。
这是我的控制器的操作之一:
[HttpPost]
public async Task<IActionResult> MyAction(long id, [Bind("id_person,name")] Person p)
{
ViewBag.message = "";
if (p.name == "")
{
ViewBag.message = "You need to set name.";
}
else if (ModelState.IsValid == false)
{
ViewBag.message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));
}
else
{
mydb_context.Update(p);
await mydb_context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(p);
}
这是关联的cshtml剃刀视图:
@model myproject.Person
<form asp-action="MyAction">
<div>@ViewBag.message</div>
<input type="hidden" asp-for="id_person" />
<input asp-for="name" />
<input type="submit">
</form>
一切正常:此操作非常适合插入和更新Person。
现在,假设我的Person实体中有第三个字段。例如“年龄”。
我希望此字段保密。这意味着我不希望用户在他的浏览器中看到此信息。我也不想将此信息放在隐藏字段中,因为用户可能会看到或更改该信息。
我的问题是,如果我保持MyAction和cshtml视图不变,则当用户更新一个人时,年龄设置为null。我希望年龄保持其实际值在数据库中。
有基本的方法吗?我不想在MyAction方法中手动设置获取和设置方法,因为我有很多字段。我想使用绑定。
谢谢
我不知道它是否仍在EFCore中可用,但我曾经在EF6中这样做。
如果只想更新Name属性,则可以使用mydb_context.Entry()
。
var person = mydb_context.Person.FirstOrDefault(p => p.id_person == id);
if(person != null)
{
mydb_context.Entry(person).Property("name").CurrentValue = "Toto";
mydb_context.SaveChanges();
}
请阅读以获取更多详细信息https://docs.microsoft.com/fr-fr/ef/ef6/saving/change-tracking/property-values