2

我想在没有任何代码的情况下将所有定义的路由输出到页面上,所以我需要RouteTable.Routes在标记中绑定到中继器。我该怎么做 -<asp:Repeater>只有DataSourceID标记中可用的值,而不是数据源。我假设我需要为中继器声明一个数据源RouteTable.Routes,然后将其 ID 提供给中继器,但我该怎么做呢?

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

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

4

2 回答 2

5

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

Repeater 标记智能感知的屏幕截图

通常,所做的是将 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# 代码调用。我不相信这可以以纯粹的声明方式来完成。

于 2012-04-29T01:22:38.723 回答
1

你需要做一些最小的管道来完成这项工作。这是一个网格视图的示例。您也可以将该技术用于中继器。

数据源对象类:

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控件添加到页面上。该向导会自动检测项目中可支持的对象,但您需要先构建解决方案。

于 2012-05-07T12:30:23.300 回答