発行者は、関連フィールドとして KeyEntity を持っています。私のコードは機能しますが、データベースからエンティティをロードする以外に、関連するフィールドを更新するより良い方法が必要だと思います。ViewModeling とテンプレートに何か問題があるはずです...よろしくお願いします。
OpViewModel
public class OpViewModel
{
public Connect.Models.Issuer Issuer { get; set; }
public IEnumerable<SelectListItem> KeyEntities { get; set; }
public OpViewModel() { }
public OpViewModel(Connect.Models.Issuer issuer,
IEnumerable<Jose.Models.KeyEntity> key_entities)
{
this.Issuer = issuer;
this.KeyEntities = key_entities.Select(k =>
new SelectListItem()
{
Selected = (k.Id == issuer.KeyEntity.Id),
Text = k.Id.ToString(),
Value = k.Id.ToString()
});
}
}
Op/Edit.chtml(カミソリ)
@model AdConnect.Models.OpViewModel
@using (Html.BeginForm()) {
<div class="editor-field">
@Html.DropDownListFor(model => model.Issuer.KeyEntity.Id,
Model.KeyEntities)
</div>
}
OpController
[HttpPost]
public ActionResult Edit(Models.OpViewModel obj)
{
if (ModelState.IsValid)
{
// This works for most data fields of Issuer, but KeyEntity's Id
// (dbo.Issuers.KeyEntity_Id) is not updated.
//
// ctx.Entry(obj.Issuer).State = System.Data.EntityState.Modified
// So load Issuer and KeyEntity from the database and update.
var issuer = ctx.Issuers.Find(obj.Issuer.Id);
if (obj.Issuer.KeyEntity != null)
{
issuer.KeyEntity =
ctx.KeyEntities.Find(obj.Issuer.KeyEntity.Id);
}
ctx.Entry(issuer).CurrentValues.SetValues(obj.Issuer);
ctx.SaveChanges();
return RedirectToAction("Index");
}
return View(obj);
}