私はクライアントを持っています:
public class Client
{
public int ClientID { get; set; }
public string ClientName { get; set; }
public virtual List<Project> Projects { get; set; }
}
そしてプロジェクト:
public class Project
{
public int ProjectID { get; set; }
public string ProjectName { get; set; }
}
クライアント コントローラーには詳細取得アクションがあります。
public ActionResult Details(int id)
{
Client client = db.Clients.Find(id);
return View(client);
}
詳細投稿アクション:
[HttpPost]
public ActionResult Details(Client client)
{
if (ModelState.IsValid)
{
db.Entry(client).State = EntityState.Modified;
db.SaveChanges();
// reload object from db to populate projects property
client = db.Clients.Find(client.ClientID);
}
return View(client);
}
私のクライアントの詳細ビュー:
@model Client
<h1>@Html.DisplayFor(model => model.ClientName)</h1>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Client</legend>
@Html.HiddenFor(model => model.ClientID)
<div class="editor-label">
@Html.LabelFor(model => model.ClientName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ClientName)
@Html.ValidationMessageFor(model => model.ClientName)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<h2>Projects</h2>
<ul>
@foreach (Project project in Model.Projects)
{
<li>@Html.ActionLink(project.ProjectName, "Details", "Project", new { id = project.ProjectID }, null)</li>
}
</ul>
プロジェクトを持つクライアントに移動すると、正常に動作し、テキスト ボックスにクライアント名とプロジェクトのリストが表示されます。名前を編集して [保存] をクリックします。しかし、サブクラス リストの繰り返しで、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というビュー エラーが発生します。
データベースからインスタンスをリロードするために、特にこの行を追加しました。これにより、遅延読み込みリスト クラスが再作成され、名前が変更されただけで、get 要求で使用したものと同じインスタンス データが得られると想定されます。
client = db.Clients.Find(client.ClientID);
ポストバックでサブクラスをロードしないのはなぜですか?
これを修正したら、データベースにレコードがない Client に移動する場合に備えて、List クラスをインスタンス化するコンストラクタを Client クラスに追加することをお勧めしますか?