我只是想创建一个列表并从后面的代码中添加元素。每个列表元素必须连接到后面代码中的函数,所以我使用Asp:LinkButton来执行此操作。在Default.aspx页面中,我有:
<asp:ListView ID="ulNumTenants" runat="server">
<ItemTemplate>
<li>
<%# DataBinder.Eval(Container.DataItem, "XXX" ) %>
</li>
</ItemTemplate>
</asp:ListView>
在后面的代码中我有以下内容:
var listItems = new List<LinkButton>();
int numberOfTenantsPossible = Space.MaxNumberOfTenants - (Space.MaleHousemates + Space.FemaleHousemates);
for (int itemCount = 0; itemCount < numberOfTenantsPossible; itemCount++ )
{
LinkButton currentItem = new LinkButton();
currentItem.CommandArgument = (itemCount + 1).ToString();
currentItem.CommandName = "Tenant_OnClick";
currentItem.Text = (itemCount + 1).ToString() + " tenants";
listItems.Add(currentItem);
}
ulNumTenants.DataSource = listItems;
ulNumTenants.DataBind();
我遇到的问题是default.aspx代码,因为当我没有从数据库中获取条目时,我不知道应该将表达式字段(“XXX”)设置为什么。非常感谢任何建议。
答案 0 :(得分:0)
试试这个:
<%# Container.DataItem %>
我怀疑它会起作用,因为我认为它只是采用LinkButton的字符串表示而不是HTML标记。但是,为什么要在代码中动态创建LinkButton?试试这个:
代码背后:
public class TenantViewModel
{
public string ID {get; set;}
public string Name {get; set;}
}
int numberOfTenantsPossible = Space.MaxNumberOfTenants - (Space.MaleHousemates + Space.FemaleHousemates);
var vms = new List<TenantViewModel>();
for (int itemCount = 0; itemCount < numberOfTenantsPossible; itemCount++ )
{
var vm = new TenantViewModel { ID = (itemCount + 1).ToString(), Name = (itemCount + 1).ToString() + " tenants"};
vms.Add(vm);
}
ulNumTenants.DataSource = vms;
ulNumTenants.DataBind();
ASPX:
<asp:ListView ID="ulNumTenants" runat="server">
<ItemTemplate>
<li>
<asp:LinkButton runat="server" CommandName="Tenant_OnClick" CommandArgument='<%# (Container.DataItem as TenantViewModel).ID' Text='<%# (Container.DataItem as TenantViewModel).Name' />
</li>
</ItemTemplate>
</asp:ListView>
这允许您在ASPX标记中保留UI元素声明,而不是在后面创建代码中的所有按钮,您只需创建一个视图模型来绑定它。 Container.DataItem
将是object
,因此我们使用as
语法将其转换为正确的类型TenantViewModel
,以便我们可以访问这些属性。这样可以产生更清晰的代码。您也可以考虑绑定到Repeater而不是ListView。 ListView通常用于直接绑定到数据库,但我们将绑定到自定义IEnumerable。
此外,如果您确实发现此标记非常清晰,您可以考虑查看ASP.NET MVC。使用Razor语法,标记变得更加清晰,因为您不必担心转换为正确的类型。不是使用转发器,而是使用foreach循环。