使用转发器而不在视图中声明数据源

Using a repeater without declaring data sources in views

我为名为 "Default" 的 aspx 页面设置了以下内容:

public partial class _Default : Page
{
    IProjectRepository projectRepository = new SPProjectRepository();

    protected void Page_Load(object sender, EventArgs e)
    {
        ViewModel = new HomeViewModel()
        {
            Projects = projectRepository.GetProjects
        };
    }

    public HomeViewModel ViewModel { get; set; }

}

在 aspx 页面上,我有以下效果很好:

<table>
    <thead>
        <tr>
            <th>Title</th>
        </tr>
    </thead>
    <tbody>
        <% foreach( var project in ViewModel.Projects ) { %>
            <tr>
                <td><%:project.Title%></td>                    
            </tr>
        <% } %>
    </tbody>
</table>

出于学习目的,我想知道如何使用中继器实现此目的...

如何像使用 foreach 循环编写直接 html 代码一样使用转发器?

我不确定您为什么要跳过传统的 DataSource 方法。但是如果你使用 ASP.NET 4.5 那么你可以使用 SelectMethod (在 4.5 版本中引入)。使用它的优点是您可以定义 Type 您的转发器控件将通过其绑定,并且在模板中您将获得 intellisense 支持。

这是一个简单的例子:-

假设您有客户类型:-

 public class Customer
 {
     public int Id { get; set; }
     public string Name { get; set; }
 }

如果你想要一个客户列表到 Repeater 控件,那么你可以简单地定义一个方法并将它分配给 Repeater 控件。不需要像 DatasourceDataBind 这样的额外代码。

 public IEnumerable rptCustomer_GetData()
 {
     return new List<Customer>
     {
          new Customer { Id =1, Name = "xx" },
          new Customer { Id =2, Name = "yy" }
     };
  }

并且在转发器中只需提供该方法名称:-

<asp:Repeater ID="rptCustomer" runat="server" SelectMethod="rptCustomer_GetData" 
                ItemType="Customer">
      <ItemTemplate>
             <asp:Label ID="lblId" runat="server" Text='<%# Item.Id %>'></asp:Label>
             <asp:Label ID="lblName" runat="server" Text='<%# Item.Name %>'></asp:Label>
      </ItemTemplate>
</asp:Repeater>

传统数据源方法:-

Page Load中只需设置数据源:-

rptCustomer.DataSource = projectRepository.GetProjects;
rptCustomer.DataBind();

并且在标记中只需使用 ASP.NET 数据绑定代码块,如下所示:-

 <asp:Label ID="lblId" runat="server" Text='<%# Id %>'>

尝试以下操作:

标记

<table>
    <thead>
        <tr>
            <th>Title</th>
        </tr>
    </thead>
    <tbody>
        <asp:Repeater ID="ProjectsRepeater" runat="server">
            <ItemTemplate>
                <tr>
                    <td><%# Eval("Title") %></td>                    
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </tbody>
</table>

C#

public partial class _Default : Page
{
    IProjectRepository projectRepository = new SPProjectRepository();

    protected void Page_Load(object sender, EventArgs e)
    {
        ProjectsRepeater.DataSource = projectRepository.GetProjects;
        ProjectsRepeater.DataBind();
    }

    public HomeViewModel ViewModel { get; set; }

}