0

我有一个名为“Entries”的表,并且正在使用 LINQ to SQL 进行数据访问。我创建了一个获取所有条目的存储过程。我已将该存储过程映射到我的数据上下文中的一个方法,我已将返回类型设置为“条目”。

我在我的数据访问类中创建了一个方法,该方法将该方法调用的结果作为列表返回。我将列表绑定到用户控件中的转发器,并尝试访问我的 ascx 文件中的属性“EntryId”,并收到以下错误:

“object”不包含“EntryId”的定义

我在 DataAccess 类中的方法:

public static List<Entry> GetAllEntries()
{
    using (DataClassesDataContext context = new DataClassesDataContext())
    {
        return context.fbGetAllEntries().ToList();
    }
}

并在用户控件的 Page_PreRender 事件中:

//my alias at the top of the file for clairification
using ASPWebControls = System.Web.UI.WebControls;

protected void Page_PreRender(System.Object sender, System.EventArgs e)
{
   rptEntries = new ASPWebControls.Repeater();

   rptEntries.DataSource = DataAccess.GetAllEntries();

   rptEntries.DataBind();
}

在我的 ascx 文件中:

<asp:Repeater ID = "rptEntries" runat = "server" >
    <ItemTemplate>
        <tr>
            <td><input type="checkbox" runat="server"  value="<%# Container.DataItem.EntryId %>"  /></td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

当我用谷歌搜索这个错误时,我发现使用匿名类型时可能会发生这种情况,但这里不是这种情况。我确信我的转发器有一个绑定到它的强类型对象列表。我试过明确地铸造:

rptEntries.DataSource = (List<Entry>)DataAccess.GetAllEntries();

我确定我的 Entry 类型有一个 EntryId,因为我可以这样做:

foreach (Entry en in (List<Entry>)rptEntries.DataSource)
{
   //when I step through I can see these are the correct values
   int i = en.EntryId;
}

我尝试在我的 ascx 文件中导入我的命名空间:

<%@ Import NameSpace="Namespace.in.my.DataClass.cs" %> 

我不确定事情在哪里横向发展,有人可以建议我做错了什么吗?任何帮助将不胜感激,谢谢!

编辑:错过了一个代码块

4

2 回答 2

2

即使项目是强类型的,中继器控件也会将它们作为对象类型公开在ItemTemplate. 您需要明确地将其拆箱:

<%# ((Entry)Container.DataItem).EntryId %>

请注意,ASP.Net 4.5有一个强类型的转发器,它允许您指定一个ItemType属性并消除拆箱的需要。

于 2012-09-12T18:39:52.453 回答
1

在复选框的数据绑定语句中尝试以下操作:

 value="<%# Eval("EntryId") %>"
于 2012-09-12T18:39:23.950 回答