介绍
我正在做一个大学项目,需要建立一个购物网站。
对于我的问题来说,重要的是"产品"。 "产品"是使用ItemTemplate
控件的ASP.Net Repeater。然后,该重复器通过用户购物车中的产品列表进行填充。
我的问题是什么?
我遇到问题的特定区域是“保存”按钮。 用户可以更改他们想要的每种产品的数量; 但是,他们必须单击“保存”按钮才能将信息发送到数据库。
问题是在我的保存按钮的onclick事件中访问正确的数量文本框。
如何在所有保存按钮的OnClick事件中访问正确的文本框?
我尝试过什么?
我最初想使用WebControl.FindControl方法。
当然,FindControl需要一个ID,并且每个文本框都需要不同的ID。
为了解决这个ID问题,我尝试过...
首先...
尝试将productId绑定到文本框ID上。
<asp:TextBox ID='quantity<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />
我后来发现这是不可能的,因为使用这种方式设置ID时,必须使用“简单ID”(例如:“button1”)。据说我可以在代码后台中设置ID。
其次...
然后我尝试使用Repeater的OnItemCreated事件动态将TextBox的ID设置为“quantityX”,其中X是产品ID。
我所做的是将productId绑定到WebControl属性中:
<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />
接着,我使用FindControl()
方法获取ID为“quantity”的文本框。在找到文本框后,我会取productId属性并将其值附加到文本框的ID中。
protected void productsList_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item)
{
TextBox quantity = (TextBox)e.Item.FindControl("quantity");
quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
}
}
我后来发现productId属性没有值,因为数据绑定还没有发生。换句话说,
Eval("productId")
没有运行。第三步...
我采用了与之前相同的方法,只有一个区别。我使用了Repeater的
OnItemDataBound
事件而不是OnItemCreated
事件。protected void productsList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item)
{
TextBox quantity = (TextBox)e.Item.FindControl("quantity");
quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
}
}
这部分有一定作用,但是有一个问题。最大产品ID的产品被跳过了。(例如,如果我有产品4、32和68,那么产品ID为68的产品将被跳过)
如下图所示,我们有3个产品。我编辑了一些文本来清楚地指出TextBoxs(因为它们被呈现出来)。
存在的ID是1、32和34。如果您查看1和32的ID属性,您会发现它们都有“quantity”和它们的产品ID附加在后面。
现在看看34的ID属性。ID属性只有“quantity”。
现在我有点困惑。
我正在使用什么?
- Visual Studio 2017
- .NET Framework 4.6.1
- 两层 WebForms 项目
- Google Chrome