DataBinder.Eval返回null,尽管该字段已填充



我在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>

CodeName字段显示正常,但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

最新更新