我正在运行ASP.NET MVC 3应用程序(C#)。
我最近在我的数据库中创建了一个可以为空的密钥。这可能不是最佳实践,但是对于我的场景是必要的。所以现在当我显示我的报告(ASPX View Engine)时,我在数据库中可以为空的对象的值将不会显示。
现在(简化)的数据结构如下:
Inventory
________________
InventoryID int PK
ShopID FK int NOT NULL
ProductID FK int NULL
唯一的变化是ProductID曾经是不可为空的。
我的ActionResult如下:
[HttpPost]
public ActionResult InventoryReport(FormCollection formVariables, InventoryReportRequest reportRequest)
{
ModelContainer ctn = new ModelContainer();
var query = ctn.Inventory.Where(ic => !ic.Deleted && ic.ShopID == reportRequest.ShopID);
if (reportRequest.ProductID.HasValue)
{
query = (from ic in query
where reportRequest.ProductID == ic.ProductID
select ic);
}
List<Inventory> checks = query.ToList();
if (checks.Count > 0)
{
return View(checks);
}
else
{
return RedirectToAction("Index");
}
}
当我通过此Action调试时,我可以看到正在检索ProductID,但Product对象仍为null。所以当我想在我的视图中显示我的结果时 -
<table class="normal" width="100%">
<tr>
<th>
Date
</th>
<th>
Shop
</th>
<th>
**Product Name**
</th>
<th>
**Product ID**
</th>
<th>
Active
</th>
</tr>
<% foreach (var item in Model) { %>
<tr>
<td>
<%: Html.DisplayFor(modelItem => item.DateChecked) %>
</td>
<td>
<%: Html.DisplayFor(modelItem => item.Shop.Name) %>
</td>
<td>
**<%: Html.DisplayFor(modelItem => item.Product.Name) %>**
</td>
<td>
**<%: Html.DisplayFor(modelItem => item.Product.ProductID) %>**
</td>
<td>
<%: Html.DisplayFor(modelItem => item.Active) %>
</td>
</tr>
<% } %>
</table>
已加星标的项目显示为空白。
对于解决此问题我需要做什么提供建议吗?如果需要更多信息,请询问:)
答案 0 :(得分:2)
实际上,如果您未对查询进行任何更改,则先前加载Product
会更令人惊讶。要加载Product
,您必须使用Include
,而不管FK是否可以为空?
ctn.Inventory.Include("Product").Where(...
无论如何,现在添加Include
,你会没事的。