中继器里有什么
本文关键字:什么 中继器 | 更新日期: 2023-09-27 18:26:44
一个问题出现在我正在使用臭名昭著的中继器的页面的特定区域。控件绑定到有效的数据源,该数据源在视图状态中持续存在。
中继器代码如下:
<asp:Repeater ID="creditRightItems" runat="server" DataSourceID="sdsOrder">
<HeaderTemplate>
<thead>
<td>Qty Returning:</td>
<td>Price:</td>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><asp:TextBox ID="txtQuantity" runat="server" PlaceHolder="0" CssClass="txtQuantity Credit-Check" data-item='<%# Eval("ProductNum") %>' /><span class="creditX">X</span></td>
<td><span id="ProductPrice" class='Credit-Container price<%# Eval("ProductNum") %>'><%# ConvertToMoney(Eval("Price").ToString()) %></span>
<input type="hidden" id="hfPrice" value="<%# Eval("Price") %>" />
<input type="hidden" id="hfProdNum" value="<%# Eval("ProductNum") %>" />
<input type="hidden" id="hfSKU" value="<%# Eval("SKU") %>" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
当我迭代Repeater时,该问题出现在代码后面。本质上,循环只找到两个控件,这可能是问题的一部分。然而,当我试图从代码后面获取这些值时,它们会返回null
。如果我添加一个runat="server"
,那么它实际上会错误中继器。
foreach (RepeaterItem item in creditRightItems.Items)
{
TextBox inputQuantity = (TextBox)item.FindControl("txtQuantity");
string quantity = inputQuantity.Text;
TextBox inputProduct = (TextBox)item.FindControl("hfProdNum");
string product = inputProduct.Text;
HtmlInputHidden productPrice = (HtmlInputHidden)item.FindControl("hfPrice");
string price = productPrice.Value;
TextBox inputSKU = (TextBox)item.FindControl("hfSKU");
string sku = inputSKU.Text;
if (string.Compare(quantity, "0") != 0 && string.IsNullOrEmpty(quantity))
items.Add(new Items(product, quantity, price, sku));
}
问题是,如何获得以下的有效值:
ProductPrice
或hfPrice
hfProdNum
hfSku
就我而言,我无法让他们返回有效的内容。我试过:
HiddenField productPrice = (HiddenField).item.FindControl("hfPrice");
string price = productPrice.Value;
HtmlInputHidden productPrice = (HtmlInputHidden).item.FindControl("hfPrice");
string price = productPrice.Value;
我知道FindControl
需要runat
,所以我试图在添加runat
时避免Repeater
中断,或者获取这些inputs
的内容
任何想法和帮助都会很棒。
源代码中的不是服务器控件,所以FindControl找不到它们。
为什么不能将隐藏字段转换为asp:HiddenField标记?
<asp:HiddenField id='hfPrice' value='<%# Eval("Price") %>' runat='server' />
符文可能没有破坏你的页面;我认为这是你的Eval电话中的单引号与双引号。如果你像我在这个例子中那样替换它们,它就会起作用。
在不知道代码的确切位置的情况下,我想您应该考虑对好的事件进行这种操作。
尝试处理ItemDataBound
事件。与其反复遍历trought每一行,不如执行以下操作:
(VB.net代码,抱歉)
Private Sub myRepeater_ItemDataBound(sender as object, e as RepeaterItemEventArgs) andles myRepeater.ItemDataBound
If (e.Item IsNot Nothing AndAlso (e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem)) Then
' DO STUFF HERE
Dim productPrice As HtmlInputHidden = (HtmlInputHidden).item.FindControl("hfPrice")
Dim price As String = productPrice.Value
End If
End Sub
所以罪魁祸首是由于引号和单引号,错误存在于:
value="<%# Eval("Price") %>"
错误不再发生,如果您这样做:
value='<%# Eval("Price") %>'
这减轻了分页中的错误,使我能够正确地运行FindControl
。对我来说,这是一个粗心的错误,但希望这能在未来帮助到别人。