我正在使用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实体中有第三个字段。例如“年龄”。
我希望这个字段是秘密的。这意味着我不想让用户在他的浏览器中看到这些信息。我也不希望将此信息放在隐藏字段中,因为用户可能会看到或更改信息。
我的问题是如果我按原样保留MyAction和cshtml视图,则当用户更新某个人时,将age设置为null。我希望年龄在数据库中保持其实际价值。
有基本的方法吗? 我不想在MyAction方法中手动设置getter和setter,因为我有很多字段。我想使用Binding。
由于
答案 0 :(得分:0)
我不知道它在EFCore中是否仍然可用,但是我曾经在EF6中这样做。
如果只想更新名称属性,则可以使用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