尽管填充了字段,DataBinder.Eval仍返回null

时间:2015-09-01 07:12:18

标签: asp.net vb.net entity-framework data-binding

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

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对象。

6 个答案:

答案 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