【发布时间】:2017-10-17 16:28:37
【问题描述】:
简介
我正在做一个大学项目,我需要建立一个购物网站。
对我的问题来说重要的是“产品”。 “产品”是一个仅使用ItemTemplate 控件的 ASP.Net 中继器。然后,转发器将填充用户购物车中的产品列表。
我的问题是什么?
我遇到问题的特定区域是“保存”按钮。 用户可以更改他们想要的每种产品的数量;但是,他们必须单击“保存”按钮才能将信息转到数据库。
问题是在我的保存按钮的 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。
其次...
然后我尝试使用中继器的 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 为“数量”的文本框。找到 TextBox 后,我将获取 productId 属性并将其值附加到 TextBox 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属性没有值;因为,DataBinding 没有发生。换句话说,Eval("productId") 没有运行。
第三次...
我采用了与之前相同的方法,但有 1 个差异。我使用了中继器的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。68 的产品 ID 将被跳过)
如下图所示,我们有 3 种产品。我在图片上编辑了一些文本,以清楚地指出文本框(在渲染时)。
存在的 ID 是 1、32 和 34。如果您查看 1 和 32 的 ID 属性,您会看到它们有“数量”以及附加的产品 ID。
现在看34的ID属性,ID属性只有“数量”。
现在我有点卡住了。
我在用什么?
- Visual Studio 2017
- .NET Framework 4.6.1
- 2 层 WebForms 项目
- 谷歌浏览器
【问题讨论】:
-
使用 asp 控件而不是简单的 html。
-
@Asif.Ali 我正在使用 ASP 控件... OP 中的最后一张图片是 chrome 开发者工具中渲染页面的屏幕截图。
-
您的问题是在保存按钮单击事件时访问文本框?
标签: c# asp.net webforms asprepeater