繁体   English   中英

将列表绑定到ListView

[英]Bind a List to a ListView

我只是试图创建一个列表,并从后面的代码向其中添加元素。 每个列表元素都必须连接到后面代码中的函数,因此我正在使用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”)设置为什么。 任何建议,不胜感激。

尝试这个:

<%# 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>

这样一来,您可以将UI元素声明保留在ASPX标记中,而无需在代码中创建所有按钮,只需创建一个视图模型即可将其绑定到。 Container.DataItem将是一个object ,因此我们使用as语法将其转换为正确的TenantViewModel类型,以便我们可以访问属性。 这样可以使代码更简洁。 除了ListView,您还可以考虑绑定到Repeater。 ListView通常用于直接绑定到数据库的两种方式,但是我们绑定到自定义IEnumerable。

另外,如果您发现此标记明显更干净,则可以考虑研究ASP.NET MVC。 使用Razor语法,标记变得更加清晰,因为您不必担心转换为正确的类型。 无需使用转发器,只需使用foreach循环即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM