将列表绑定到ListView

时间:2014-11-23 14:10:45

标签: c# asp.net

我只是想创建一个列表并从后面的代码中添加元素。每个列表元素必须连接到后面代码中的函数,所以我使用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”)设置为什么。非常感谢任何建议。

1 个答案:

答案 0 :(得分: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,以便我们可以访问这些属性。这样可以产生更清晰的代码。您也可以考虑绑定到Repeater而不是ListView。 ListView通常用于直接绑定到数据库,但我们将绑定到自定义IEnumerable。

此外,如果您确实发现此标记非常清晰,您可以考虑查看ASP.NET MVC。使用Razor语法,标记变得更加清晰,因为您不必担心转换为正确的类型。不是使用转发器,而是使用foreach循环。