使用转发器而不在视图中声明数据源
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 控件。不需要像 Datasource
、DataBind
这样的额外代码。
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; }
}
我为名为 "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 控件。不需要像 Datasource
、DataBind
这样的额外代码。
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; }
}