我在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
我正在尝试在Bench
中显示GridView
实体,如下所示(正确实施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对象。
答案 0 :(得分:0)
不应该吗?
<asp:Label id="lblBenchType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "BenchType.Name")%>'>
因为
Public Property Type() As BenchType
答案 1 :(得分:0)
这对我有用。
<asp:TemplateField HeaderText="Bench Type">
<ItemTemplate>
<asp:Label id="lblBenchType" runat="server" Text='<%# Bind("Type.Name")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
答案 2 :(得分:0)
只是一个盲目的镜头,但你应该有一个新的构造函数吗?
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
我想知道数据库是否无法填充,因为该类尚未实例化。
答案 3 :(得分:0)
Eval正在寻找对象名称和属性名称,在这种情况下,对象是&#34; Type&#34;该物业是&#34;名称&#34;。所以长话短说,这应该有用。我认为问题在于&#39; Type&#39;是保留关键字。尝试将子类的名称更改为更具描述性的名称,并查看是否有所不同。我希望这会有所帮助。
<asp:TemplateField>
<ItemTemplate>
<asp:Label Id="lblSubclassVal" runat="server" Text="<%# DataBinder.Eval(Container.DataItem, "SubClass.PropertyName")%>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
答案 4 :(得分:0)
作为
[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:乙 我不熟悉Vb.Net,iv用C#编写代码
答案 5 :(得分:0)
问题似乎是由于以下原因:
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