在阅读了一些最佳实践后,我现在使用的是一个为每个视图定制的viewmodel,我的控制器方法将视图模型传递给视图,然后更新数据库。
我使用LINQ投影让我的GET方法正常工作,但我不知道在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();
}
}
My Post方法正在运行,但我不认为这是最好的方法。我这样做的原因是当我刚刚创建了EF Proposal模型并将其属性映射到viewmodel属性时,它将我的User_Facility_ID值更改为null,因为我没有在我的表单中使用它。
所以我真的只是寻找执行POST的最佳方式。
答案 0 :(得分:2)
您正在做的是“正确”方法,您需要从上下文中获取实体,进行更新,然后保存更改。
当您使用AutoMapper等地图工具时,请确保从地图中排除不想更新的关键字段。