我有客戶:延遲加載類不加載 - MVC
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>
現在,如果我去其中有項目的客戶端,它工作得很好,我看到在文本框中的客戶名稱和項目的清單。我編輯名稱並點擊保存。但是,然後在子類列表迭代的視圖錯誤,「對象引用未設置爲對象的實例。」
我在這一行中特別添加了從db重新加載實例,假設它會重新填充lazy-loading list類,並且我將擁有與我在get請求中一樣的實例數據,只是名稱已更改:
client = db.Clients.Find(client.ClientID);
爲什麼它不在回發中加載子類?
一旦我解決了這個問題,在Client類中添加一個實例化List類的構造函數,以防導航到在數據庫中沒有任何記錄的客戶端時,
其中'db'初始化? – qujck 2013-03-22 09:25:28
@qujck - 在ClientController中 – Sean 2013-03-22 09:28:16
您確定您的修改已保存在數據庫中嗎?因爲您的動作的客戶端參數是根據您的動作簽名由模型聯編程序生成的「模型類」(而非實體代理類imho)。由於客戶端類沒有構造器初始化項目,因此項目會獲取默認值:null。 – tschmit007 2013-03-22 09:29:16