2014-11-23 121 views
0

我只是试图创建一个列表并从后面的代码向其添加元素。每个列表元素必须连接到后面代码中的函数,所以我使用Asp:LinkBut​​ton来执行此操作。在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

试试这个:

<%# Container.DataItem %> 

我怀疑它会工作,因为我认为这将只是采取一个LinkBut​​ton的字符串表示,而不是HTML标记。但是,为什么在代码中动态创建LinkBut​​ton?试试这个:

代码背后:

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,因此我们可以访问属性。这导致更简洁的代码。而不是一个ListView,你也可以考虑绑定到一个Repeater。 ListView通常用于直接绑定到数据库的两种方式,但我们绑定到一个自定义IEnumerable。另外,如果你发现这个标记明显更清晰,你可以考虑查看ASP.NET MVC。使用Razor语法的标记甚至更清晰,因为您不必担心转换为正确的类型。而不是使用中继器,你只需使用foreach循环。