2015-06-16 16 views
5

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!

+1

Credo che usare qualcosa come AutoMapper potrebbe essere un modo per andare. – Kamo

+2

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 –

+1

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. –

risposta

6

EF ha anche un semplice "AutoMapper" incorporato che funziona con valori scalari.

public class PostViewModel() 
{ 
    public string Id {get;set;} 
    public string Title {get;set;} 
    public string Summary {get;set;} 
    public string Content {get;set;} 
} 

public ActionResult Edit(PostViewModel viewModel) 
{ 
    if (ModelState.IsValid) { 
     var newsPost = db.Posts.Find(post.Id); 
     ... 
     db.Entry(newsPost).CurrentValues.SetValues(viewModel); 
     ... 
    } 
} 
+2

Questo è davvero l'unico modo per farlo ... quella chiamata in più al db mi fa rabbrividire ... – Worthy7

+0

Ma mattoy santo era semplice. Grande. – Worthy7