我在asp.net应用程序中显示我的一个实体的对象字段时遇到了麻烦。DataBinder.Eval
由于某种原因返回Nothing
。
我有两个类如下:
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对象
不应该吗?
<asp:Label id="lblBenchType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "BenchType.Name")%>'>
以来 Public Property Type() As BenchType
这对我有用。
<asp:TemplateField HeaderText="Bench Type">
<ItemTemplate>
<asp:Label id="lblBenchType" runat="server" Text='<%# Bind("Type.Name")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
只是盲目的,但是你应该有一个新的构造函数吗?
Public Class Bench
Public Sub new()
Me.Type=new BenchType
End Sub
<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
我想知道数据库是否无法填充,因为类还没有实例化。
Eval正在查找对象名称和属性名称,在本例中,对象是"Type",属性是" name "。长话短说,这应该行得通。我认为问题在于"Type"是一个保留关键字。尝试将子类的名称更改为更具描述性的名称,看看是否会有所不同。我希望这对你有帮助。
<asp:TemplateField>
<ItemTemplate>
<asp:Label Id="lblSubclassVal" runat="server" Text="<%# DataBinder.Eval(Container.DataItem, "SubClass.PropertyName")%>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
As
[type]是用户自定义类型
Public Property Type() As BenchType
和
Public Class BenchType
<ScaffoldColumn(False), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)> _
Public Property ID() As Integer
<Required, StringLength(50)> _
Public Property Name() As String
...
End Class
所以你通常不能在网格视图中绑定这个类型比如
<asp:Label id="lblBenchType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Type.Name")%>'>
或者类似
的东西<asp:Label id="lblBenchType" runat="server" Text='<%# Eval("Type.Name")%>'>
解决方案:
首先,您需要将结果数据转换为类型,然后通过属性名获取所需值。
<asp:Label ID="lb1" runat="server" Text='<%# (Eval("Type") as BenchType).Name %>'></asp:Label>
N: B我不熟悉Vb。Net,我已经用c#写了代码
看来问题是由以下原因引起的:
-
BenchType
对象不可序列化 -
SELECT
方法使用延迟加载而不是即时加载
必须进行以下更改;
更改BenchType
类如下:
<Serializable> _
Public Class BenchType
<ScaffoldColumn(False), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)> _
Public Property ID() As Integer
<Required, StringLength(50)> _
Public Property Name() As String
...
End Class
更改DAL SELECT
方法如下:
Public Function GetBenches() As IQueryable(Of Bench)
Return (From c In _db.BENCHES.Include("Type") Select c)
End Function