什么在中继器

时间:2014-10-16 19:06:17

标签: c# asp.net

我正在使用臭名昭着的 Repeater 的页面的某个特定区域出现了一个问题。该控件绑定到一个有效的数据源,该数据源通过视图状态保持不变。

Repeater 代码如下:

<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",那么它实际上会错误 Repeater

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));
}

问题是,如何获得有效值:

  • ProductPricehfPrice
  • hfProdNum
  • hfSku

对于我的生活,我无法让他们返回有效的内容。我试过了:

HiddenField productPrice = (HiddenField).item.FindControl("hfPrice");
string price = productPrice.Value;

HtmlInputHidden productPrice = (HtmlInputHidden).item.FindControl("hfPrice");
string price = productPrice.Value;

我知道FindControl需要runat,因此当我添加Repeater时,我正试图找到一种方法来避免runat中断获取inputs

的内容的方法

任何想法和帮助都会非常棒。

3 个答案:

答案 0 :(得分:3)

您的源代码中没有服务器控件,因此FindControl无法找到它们。

为什么不能将隐藏字段转换为asp:HiddenField标记?

<asp:HiddenField id='hfPrice' value='<%# Eval("Price") %>' runat='server' />

runat可能不会打破你的页面;我认为这是您Eval通话中的单引号和双引号。如果您像我在此示例中那样替换它们,它将起作用。

答案 1 :(得分:1)

好吧,如果不知道你的代码到底在哪里,我想你应该考虑在好事件上做这个操作。

尝试处理ItemDataBound事件。而不是迭代每一行,做一些像:

(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

答案 2 :(得分:1)

因此,罪魁祸首是由于引用和单引号,错误存在于:

value="<%# Eval("Price") %>"

如果您执行以下操作,则不再出现错误:

value='<%# Eval("Price") %>'

这减轻了分页中的错误,这使我能够正确运行FindControl。对我来说是一个粗心的错误,但希望这有助于将来的某个人。