如何在aspx标记中将IEnumerable绑定到Repeater?

时间:2012-04-29 01:00:29

标签: asp.net repeater datasource objectdatasource

我想将所有已定义的路由输出到页面上而不需要任何代码,因此我需要将RouteTable.Routes绑定到标记中的Repeater。我该怎么做 - <asp:Repeater>在标记中只有DataSourceID值,而不是DataSource。 我假设我需要为RouteTable.Routes声明一个DataSource,然后将它的ID提供给Repeater,但我该怎么做?

同样,我需要一个没有任何代码隐藏的解决方案,只需要声明。

我使用的是asp.net 4.0(不是MVC)

2 个答案:

答案 0 :(得分:5)

asp.net Repeater控件确实有一个DataSource属性,您可以在aspx标记中设置它(参见下面的屏幕截图):

Screen shot of Repeater markup intellisense

通常,所做的是将DataSource属性设置为数据绑定表达式,该表达式在调用Page.DataBind()方法时进行计算。

<asp:Repeater ID="foo" DataSource = '<%# GetRoutes() %>' runat=server ></asp:Repeater>

我认为您仍然需要页面上的一些代码来调用Page.DataBind()来启动aspx页面上的数据绑定。

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.DataBind();
    }

这段代码可以放在代码隐藏中,或者因为你不想在aspx页面的服务器代码块中使用代码隐藏。但我相信它必须通过页面事件处理程序中的C#代码调用。我不相信这可以用纯粹的陈述方式来完成。

答案 1 :(得分:1)

你需要做一些最小的管道来使这项工作。这是gridview的示例。您也可以为转发器调整技术。

DataSource对象类:

public class MyObjectDataSourceEntity
{
    [DataObjectMethod(DataObjectMethodType.Select)]
    public DataTable GetSomeRecords()
    {
        DataTable names = new DataTable();
        DataColumn FirstName = names.Columns.Add();
        FirstName.DataType = typeof(string);
        FirstName.ColumnName = "FirstName";
        DataColumn LastName = names.Columns.Add();
        LastName.DataType = typeof(string);
        LastName.ColumnName = "LastName";

        DataRow row = names.NewRow();
        row[0] = "Arun";
        row[1] = "Jayapal";
        names.Rows.Add(row);
        row = names.NewRow();
        row[0] = "Namith";
        row[1] = "Chandran";
        names.Rows.Add(row);
        return names;
    }

您需要包含System.ComponentModel命名空间。

标记:

    <asp:GridView ID="GridView1" runat="server" AllowSorting="True" 
        DataSourceID="ObjectDataSource1">
    </asp:GridView>
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
        SelectMethod="GetSomeRecords" 
        TypeName="ObjectDataSourceDemo.MyObjectDataSourceEntity">
    </asp:ObjectDataSource>

注意:我在这里添加了一个数据表,因为gridview只有在开箱即用的排序时才能理解该对象。所以你不必编写额外的代码。否则,您使用任何IEnumerable对象。但是你必须编写自己的逻辑进行排序。与中继器无关,但我想我会提到这一点。

现在您无需在任何事情上致电DataBind() !!!

PS:为实体编写代码后,首先构建项目。在此之后,您可以依靠设计人员将ObjectDataSource控件添加到页面上。该向导会自动检测项目中的可支持对象,但您需要先构建解决方案。