Sto scrivendo un'applicazione con asp.net core 2.0 mvc.
Ecco una delle azioni del mio controller:
[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);
}
Ed ecco la vista del rasoio cshtml associata:
@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>
Tutto funziona bene: questa azione è perfetta per inserire e aggiornare le persone.
Supponiamo che io abbia un terzo campo nella mia entità Person. Ad esempio "età".
Voglio che questo campo sia segreto. Questo significa che non voglio che l'utente veda queste informazioni nel suo browser. Non voglio anche mettere queste informazioni in un campo nascosto perché l'utente può vedere o modificare le informazioni.
Il mio problema è se mantengo MyAction e cshtml come sono, l'età è impostata su null quando un utente aggiorna una persona. Voglio che l'età mantenga il suo valore effettivo nel database.
C'è un modo semplice per farlo? Non voglio impostare manualmente getter e setter nel metodo MyAction, perché ho molti campi. Voglio lavorare con Binding.
Grazie
Non so se è ancora disponibile in EFCore ma lo facevo in EF6.
Se vuoi solo aggiornare il nome propoerty, puoi usare 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();
}
Leggi questo per maggiori dettagli https://docs.microsoft.com/fr-fr/ef/ef6/saving/change-tracking/property-values