【问题标题】:MVC Controller Post Method with ViewModel to Update EF Entities使用 ViewModel 更新 EF 实体的 MVC 控制器发布方法
【发布时间】:2013-09-12 18:12:03
【问题描述】:

经过大量阅读最佳实践后,我现在使用为每个视图定制的视图模型,我的控制器方法将视图模型传递给视图,然后更新数据库。

我的 GET 方法使用 LINQ 投影可以正常工作,但我不确定在 POST 方法中要做什么。如果我的 viewmodel 仅包含其视图正在更新的属性,但该特定键的数据库中已经存在一个条目,如何使用 viewmodel 属性更新我的 EF 模型,而无需每次都获取 EF 模型中的每个属性?

这是我的代码:

视图模型

public class GeneralViewModel
{
    public string Title { get; set; }
    public decimal? Proposal_Type_ID { get; set; }
    public string User_Facility_ID { get; set; }
    public IEnumerable<SelectListItem> ProposalTypes { get; set; }
}

控制器

    public ActionResult General(int id)
    {
        var context = new PASSEntities();

        var model = (from a in context.Proposals
                     where a.ID == id
                     select new GeneralViewModel()
                     {
                         User_Facility_ID = a.User_Facility_ID,
                         Title = a.Title,
                         Proposal_Type_ID = a.Proposal_Type_ID
                     }).SingleOrDefault();

        var proposalTypes = context.Proposal_Types.Where(m => m.User_Facility_ID == model.User_Facility_ID).ToList();
        model.ProposalTypes = proposalTypes.Select(m => new SelectListItem { Value = m.ID.ToString(), Text = m.Description }).ToList();

        return PartialView(model);
    }


    [HttpPost]
    public ActionResult General(int id, GeneralViewModel model)
    {
        try
        {
            var context = new PASSEntities();
            var proposal = context.Proposals.Find(id);

            proposal.Title = model.Title;
            proposal.Proposal_Type_ID = model.Proposal_Type_ID;

            context.Entry(proposal).State = System.Data.EntityState.Modified;
            context.SaveChanges();

            return PartialView();
        }
        catch
        {
            return View();
        }

    }

我的 Post 方法有效,但我觉得这不是最好的方法。我这样做的原因是当我刚刚新建一个 EF Proposal 模型并将其属性映射到 viewmodel 属性时,它将我的 User_Facility_ID 值更改为 null,因为我没有在我的表单中使用它。

所以我真的只是在寻找执行 POST 的最佳方式。

【问题讨论】:

  • 您可以使用AutoMapper 将新值从您的 ViewModel 映射到您现有的域模型。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您正在做的是“正确”的方法,您需要从上下文中获取您的实体,进行更新,然后保存更改。

当您使用 AutoMapper 之类的映射工具时,请确保从映射中排除您不想更新的关键字段。

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多