ベストプラクティスをたくさん読んだ後、私は現在、すべてのビュー用にカスタマイズされたビューモデルを使用しており、コントローラーメソッドはビューモデルをビューに渡し、データベースを更新しています。
LINQ プロジェクションを使用して GET メソッドが正しく機能していますが、POST メソッドで何をすべきかわかりません。ビューモデルにそのビューが更新するプロパティのみが含まれているが、その特定のキーのエントリがデータベースに既に存在する場合、毎回 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 モデルを新しく作成し、そのプロパティをビューモデルのプロパティにマップしたときに、フォームで使用しなかったため、User_Facility_ID の値が null に変更されたためです。
だから本当に私はPOSTを実行するための最良の方法を探しています.