Sto tentando di aggiornare un post di notizie. Il post ha un campo Data chiamato Creato che viene popolato quando il record viene inizialmente creato. Non includo questo quando si aggiorna, quindi quando si utilizza il metodo seguente, questo è nullo e genera un errore.Qual è il modo migliore per aggiornare solo alcuni campi di un oggetto in MVC?
Sto usando MVC 5 e Entity Framework 6
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,Title,Summary,Content")] Post post) {
if (ModelState.IsValid) {
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}
Questo metodo funziona, ma sembra un po 'goffo.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,Title,Summary,Content")] Post post) {
if (ModelState.IsValid) {
var newsPost = db.Posts.Find(post.Id);
if (newsPost == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); }
newsPost.Title = post.Title;
newsPost.Summary = post.Summary;
newsPost.Content = post.Content;
db.Entry(newsPost).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}
Qual è il metodo migliore per farlo?
Grazie!
Credo che usare qualcosa come AutoMapper potrebbe essere un modo per andare. – Kamo
Con EF6 dovresti essere in grado di usare 'db.Entry (post) .State = EntityState.Modified;' seguito da 'db.Entry (post) .Property (x => x.Created) .IsModified = false;' prima salvando –
Guarderei il modello ViewModel (http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx). Componi un modello di visualizzazione, invialo al tuo metodo HttpGet, ritorna al metodo HttpPost, convalida, aggiorna il tuo modello di entità. Come ha sottolineato Kamo, Automapper è perfetto per questo. Quindi è possibile utilizzare Html.HiddenFor sui campi che non si desidera aggiornare. –