【发布时间】:2015-09-01 07:12:18
【问题描述】:
我在 asp.net 应用程序中显示我的一个实体的对象字段时遇到问题。 DataBinder.Eval 出于某种原因返回 Nothing。
我有 2 个类如下:
Public Class Bench
<ScaffoldColumn(False), StringLength(50), Key> _
Public Property Code() As String
<Required> _
Public Property Type() As BenchType
<Required, StringLength(50)> _
Public Property Name() As String
...
End Class
Public Class BenchType
<ScaffoldColumn(False), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)> _
Public Property ID() As Integer
<Required, StringLength(50)> _
Public Property Name() As String
...
End Class
我正在尝试在GridView 中显示Bench 实体,如下所示(使用正确实现的ObjectDataSource odsBenches):
<asp:GridView ID="grwBenches" runat="server" DataSourceID="odsBenches"
DataKeyNames="Code,Type,Name" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Code">
<ItemTemplate>
<asp:Label id="lblCode" runat="server" Text='<%# Bind("Code")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label id="lblName" runat="server" Text='<%# Bind("Name")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Bench Type">
<ItemTemplate>
<asp:Label id="lblBenchType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Type.Name")%>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Code 和 Name 字段显示正常,但 Type 字段显示为空,这是渲染页面的结果标记:
<table cellspacing="0" rules="all" border="1" id="MainContent_grwBenches" style="border-collapse:collapse;">
<tr>
<th scope="col">Code</th><th scope="col">Name</th><th scope="col">Bench Type</th>
</tr><tr>
<td>
<span id="MainContent_grwBenches_lblCode_0">OK Code</span>
</td><td>
<span id="MainContent_grwBenches_lblName_0">OK Name</span>
</td><td>
<span id="MainContent_grwBenches_lblBenchType_0"></span>
</td>
</tr>
</table>
当我单步执行代码时,<%# DataBinder.Eval(Container.DataItem, "Type.Name")%> 似乎返回 Nothing,但是当我检查数据库时,Type 字段包含类型代码。
可能是什么问题?
编辑(DAL 代码):
Public Function GetBenches() As IQueryable(Of Bench)
Return _db.BENCHES
End Function
_db 是 DBContext 对象。
【问题讨论】:
-
您可以尝试 如果这是 Nothing(它应该是
.ToString() 的结果),那么您的代码会返回一个null 类型实例。数据库没问题不代表代码没问题。 -
确实是这样,但我使用实体框架自动从对象生成数据库。我应该检查什么?
-
这样的话,你的意思是
<%# DataBinder.Eval("Type") %>什么都不是?在这种情况下,您可以在一个小型控制台应用程序中检查发生了什么。只需使用 ObjectDataSource 使用的方法并调试它给出的结果。或者,如果您使用 SQL Server,请查看 SQL Server profiler。 -
在命令窗口中,
? Eval("Type")返回 Nothing。我查询数据库,有一个名为Type_ID的字段,它填充了正确的 ID。我试过Eval("Type_ID")但这导致了一个错误。 -
如果 Type 什么都不返回,那么是的,它肯定解释了为什么 Type.Name 也是 null。 DataBinder.Eval 只是在空中间对象上静默失败(如本例中的 Type)
标签: asp.net vb.net entity-framework data-binding