C# 在MVC中只更新对象的某些字段的最佳方法是什么?

C# 在MVC中只更新对象的某些字段的最佳方法是什么?,c#,asp.net-mvc,asp.net-mvc-5,entity-framework-6,C#,Asp.net Mvc,Asp.net Mvc 5,Entity Framework 6,我正在更新一篇新闻文章。post有一个名为Created的日期字段,该字段在最初创建记录时填充。我在更新时不包括这个,所以当使用下面的方法时,它是null并抛出一个错误 我正在使用MVC5和实体框架6 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include = "Id,Title,Summary,Content")] Post post) { if (ModelState.IsValid)

我正在更新一篇新闻文章。post有一个名为Created的日期字段,该字段在最初创建记录时填充。我在更新时不包括这个,所以当使用下面的方法时,它是null并抛出一个错误

我正在使用MVC5和实体框架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);
}
这种方法确实有效,但似乎有点笨拙

[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);
}
这样做的最佳实践方法是什么


谢谢

EF还有一个简单的内置“AutoMapper”,可以处理标量值

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

我相信使用AutoMapper之类的东西可能是一个不错的选择后跟
db.Entry(post).Property(x=>x.Created).IsModified=false在savingI之前,我会查看ViewModel模式()。编写一个视图模型,将其发送到HttpGet方法,发回HttpPost方法,验证并更新实体模型。正如卡莫指出的,Automapper在这方面做得很好。然后,您可以在不想更新的字段上使用Html.HiddenFor。@SteveGreene,谢谢您的评论。对于我不想修改的字段,我希望避免使用Html.HiddenFor,因为通过代理或浏览器插件等更改这些字段很简单。解决此问题后,您就不必传递隐藏字段。这真的是唯一的方法吗。。。打给db的那个额外的电话让我畏缩…但天哪,这很简单。伟大的