2015-06-16 14 views
5

Haber bültenini güncellemeye çalışıyorum. Yayının, kayıt başlangıçta oluşturulduğunda doldurulan Oluşturuldu adlı bir tarih alanı vardır. Güncelleme sırasında bunu eklemiyorum, bu nedenle aşağıdaki yöntemi kullanırken, bu boştur ve bir hata verir.MVC'deki bir nesnenin yalnızca bazı alanlarını güncellemenin en iyi yolu nedir?

MVC 5 ve Varlık Çerçeve 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); 
} 

Bu yöntem çalışması yok kullanıyorum ama biraz aksak görünüyor.

[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); 
} 

Bunu yapmanın en iyi yöntemi nedir?

Teşekkürler!

+1

AutoMapper gibi bir şey kullanmanın bir yol olabileceğine inanıyorum. – Kamo

+2

EF6 ile 'db.Entry (post) .State = EntityState.Modified;' db.Entry (post) .Property (x => x.Created) .IsModified = false; 'önce kullanabilmeniz gerekir. –

+1

kaydetme ViewModel şablonuna bakıyorum (http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx). Bir görünüm modeli oluşturun, HttpGet yönteminize gönderin, HttpPost yöntemine geri gönderin, doğrulama modelinizi güncelleyin. Kamo'nun işaret ettiği gibi, Automapper bunun için harika. Ardından, güncellemek istemediğiniz alanlarda Html.HiddenFor kullanabilirsiniz. –

cevap

6

EF ayrıca, skaler değerlerle çalışan basit bir yerleşik "AutoMapper" özelliğine de sahiptir.

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

Bu gerçekten bunu yapmanın tek yolu bu db için ekstra çağrı beni ... – Worthy7

+0

Ama kutsal moley basitti. Harika. – Worthy7