我在将 Button 控件添加到 .aspx 页面中的特定位置时遇到了困难。我想我可以创建按钮,但我不知道如何将它添加到页面。
代码如下:
<%
var cpus = productItems.FindAll(t => t.Type == "cpu");
foreach (var cpu in cpus)
{ %>
<div class="row product cpu">
<div class="col-md-3">
<img class="center-block" src="Content/images/processor.jpg" />
<span class="price"><%= cpu.Price %></span>
<span class="addtocart">
<% Button b = new Button();
b.ID = "Button" + cpu.ID;
b.CommandArgument = cpu.ID.ToString();
b.Text = "Add to Cart";
b.OnClientClick = "Addtocart_Click";
%>
</span>
<br />
</div>
</div>
<% } %>
我也可以创建 Button 作为 productItems 集合的一部分,但仍然存在如何在页面上呈现按钮的问题。
我确定有更好的方法来做到这一点,只是不知道在哪里看。
提前致谢。
在 WebForms 中,您可以使用具有数据源(对象的一些列表)概念的列表控件和呈现每个对象如何显示的模板。通常,只要您有要在网站上呈现的项目列表,就应该使用这些。
在这种特殊情况下,您可能希望使用ListView控件。这允许您定义布局模板和项目模板。
您的 aspx 标记如下所示:
<asp:ListView ID="lvCpus" OnItemDataBound="lvCpus_ItemDataBound" runat="server">
<LayoutTemplate>
<div class="row product cpu">
<div runat="server" id="itemPlaceholder"></div>
</div>
</LayoutTemplate>
<ItemTemplate>
<div runat="server" class="col-md-3">
<img class="center-block" src="Content/images/processor.jpg" />
<span class="price"><%# Eval("Price") %></span>
<span class="addtocart">
<asp:Button ID="addToCart" Text="Add To Cart" runat="server" />
</span>
</div>
</ItemTemplate>
</asp:ListView>
这定义了一个 ListView 控件并创建了一个LayoutTemplate
与您的容器相匹配的控件。它在内部有一个 div,该 div 必须具有 id itemPlaceholder,用于填充绑定到此控件的各种项目。
该ItemTemplate
部分定义了您期望每个单独项目的外观。在本例中,它是一个包含要购买的 CPU 的列。
请注意,该按钮被定义为常规 ASP Web 控件,但没有设置任何动态数据。那是因为如果您尝试像CommandArgument
评估项一样分配属性,则服务器标记的格式将不正确,您将获得 YSOD。要解决此问题,您需要为将数据绑定到此 Web 控件时调用的 ListView 指定一个 OnItemDataBound 函数。就我而言,它被称为lvCpus_ItemDataBound
.
本例中的 ItemDataBound 方法如下所示:
protected void lvCpus_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
var cpu = e.Item.DataItem as Cpu;
if (cpu == null)
{
return;
}
var btn = e.Item.FindControl("addToCart") as Button;
if (btn == null)
{
return;
}
btn.CommandArgument = cpu.Id.ToString();
// Set other server-side properties required from code.
}
}
绑定数据源时,其中包含 0 个或多个项目。对于数据源中的每个项目,都会调用此方法,并让您指定无法在模板中直接表达的服务器端适当值。
在我们的例子中,我们CommandArgument
从Cpu
类中指定,但也可以指定其他值。
最后,我们需要确保我们可以用数据填充列表视图。所以也许在 Page_Load 中,我们可以像下面这样将数据绑定到这个 ListView:
protected void Page_Load(object sender, EventArgs e)
{
lvCpus.DataSource = GetCpus();
lvCpus.DataBind();
}
private IEnumerable<Cpu> GetCpus()
{
yield return new Cpu { Id = 1, Price = 5 };
yield return new Cpu { Id = 2, Price = 10 };
yield return new Cpu { Id = 3, Price = 15 };
yield return new Cpu { Id = 4, Price = 15 };
yield return new Cpu { Id = 5, Price = 20 };
}
我们首先将 List View 的数据源设置为您拥有的 CPU 列表,然后DataBind()
在 ListView 上调用该方法。这会触发 OnItemDataBound 函数开始填充数据,最后您会在网站上显示 5 个 CPU。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句