asp.net core 2.0 mvcを使用してアプリケーションを作成しています。
これが私のコントローラーのアクションの1つです。
[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エンティティに3番目のフィールドがあるとします。たとえば、「年齢」。
このフィールドは秘密にしておきたい。つまり、ユーザーがブラウザでこの情報を表示したくないということです。ユーザーが情報を表示または変更する可能性があるため、この情報を非表示フィールドに入れたくないのです。
私の問題は、MyActionとcshtmlビューをそのままにしておくと、ユーザーが人を更新するときに年齢がnullに設定されることです。年齢がデータベースに実際の値を保持するようにします。
これを行う基本的な方法はありますか? MyActionメソッドでgetterとsetterを手動で設定したくないのは、フィールドがたくさんあるためです。バインディングを使用したい。
ありがとう
まだ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