在嵌套转发器的页脚内找到控件? (.NET 2.0,C#)

时间:2009-12-16 18:42:53

标签: c# asp.net commerceserver2007

在嵌套转发器的页脚中查找数量框控件时,我收到空引用错误。执行OnItemCommand函数时会发生错误(不是在数据被绑定到转发器时,这是我之前遇到的问题,但已修复)。

我是一个新手,所以我不明白这一切,我正在努力解决这个问题,但我不知道为什么FindControl在一个foreach repeateritem里面({{3在该转发器的页脚中找不到控件。这让我疯了。

请帮忙!

更新:我更改了代码,但仍然遇到同样的问题 - 我正在错误地引用ddl,并且我一直将对象引用设置为对象的实例。

以下是代码:

.NET:

    <asp:Content ID="ProductRepeater" ContentPlaceHolderID="ProductRepeater" Runat="Server">
  <asp:Repeater ID="chairRepeater" OnItemCommand="productRepeater_ItemCommand" OnItemDataBound="chairRepeater_ItemDataBound" runat="server">
    <ItemTemplate>
      ...
      <asp:Repeater ID="variantRepeater" OnItemDataBound="variantRepeater_ItemDataBound" runat="server">
        <ItemTemplate>
          <li>
            <asp:RadioButton ID="radioBtn" GroupName="collections" runat="server"></asp:RadioButton>
            <asp:HiddenField ID="variantId" runat="server" />
            <asp:Literal ID="Image1" runat="server" />
            &nbsp;
            <asp:Literal ID="collectionName" runat="server" />
            &nbsp;&ndash;&nbsp;
            <asp:Literal ID="listPrice" runat="server" />
          </li>
        </ItemTemplate>
        <FooterTemplate>
        </ul>
          <asp:DropDownList ID="quantityLister" runat="server" />
        </FooterTemplate>
      </asp:Repeater>
         <asp:ImageButton ID="addToCart" ImageUrl="assets/images/_addtocart.gif"  runat="server" />
      </div>
      </div>
    </ItemTemplate>
    <SeparatorTemplate> <br />
    </SeparatorTemplate>
    <FooterTemplate> </FooterTemplate>
  </asp:Repeater>

C#:

protected void productRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    BasketHelper basketHelper = new BasketHelper(SiteContext.Current.ShoppingBasketName);
    OrderForm orderForm = basketHelper.GetOrderForm();
    bool basketUpdated = false;

    string catalogName = ConfigurationManager.AppSettings["PatioCatalogName"];
    string productId = ((HiddenField)e.Item.FindControl("productId")).Value;
    string variantId = "";

    Repeater variantRepeater = (Repeater)e.Item.FindControl("variantRepeater");
    foreach (RepeaterItem item in variantRepeater.Items)
    {
        RadioButton radioBtn = item.FindControl("radioBtn") as RadioButton;

        if (radioBtn.Checked == true)
        {
            variantId = ((HiddenField)item.FindControl("variantId")).Value;
        }
    }
        int quantity = 0;
        DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");
        string ddlvalue = quantityLister.SelectedValue;
        int.TryParse(ddlvalue, out quantity);

        if (quantity > 0)
        {
            orderForm.LineItems.Add(new LineItem(catalogName, productId, variantId, quantity));
            basketUpdated = true;
        }
    if (basketUpdated)
    {
        basketHelper.Basket.Save();

        Response.Redirect(
            String.Format(
                CultureInfo.InvariantCulture,
                "~/cart.aspx?{0}={1}",
                SiteConstants.ActionQueryStringKey,
                SiteConstants.RunPipelineCartAction),
            true);
    }
}

这是按下我的购买按钮时出现的错误:

Server Error in '/' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 116:            int quantity = 0;
Line 117:            DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");
Line 118:            string ddlvalue = quantityLister.SelectedValue;
Line 119:            int.TryParse(ddlvalue, out quantity);
Line 120:


Source File: c:\Inetpub\patios\chaircovers.aspx.cs    Line: 118

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
   ChairCovers.productRepeater_ItemCommand(Object source, RepeaterCommandEventArgs e) in c:\Inetpub\patios\chaircovers.aspx.cs:118
   System.Web.UI.WebControls.Repeater.OnItemCommand(RepeaterCommandEventArgs e) +108
   System.Web.UI.WebControls.Repeater.OnBubbleEvent(Object sender, EventArgs e) +68
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.RepeaterItem.OnBubbleEvent(Object source, EventArgs e) +123
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.ImageButton.OnCommand(CommandEventArgs e) +111
   System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +176
   System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

2 个答案:

答案 0 :(得分:1)

所以我改变了这个:

DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");

到此:

DropDownList quantityLister = variantRepeater.Controls[variantRepeater.Controls.Count - 1].FindControl("quantityLister") as DropDownList;

并且有效。

答案 1 :(得分:0)

我做了这个已经有一段时间了,但作为尝试的想法,

由于它是嵌套的,html中嵌套的页眉或页脚控件的实际名称是外部转发器控件名称(我认为),下划线('_')和内部名称的串联页眉/页脚控制...你在你的发现中使用它吗?

第二个建议: 改变你的代码

foreach (RepeaterItem item in variantRepeater.Items)
{
      decimal quantity = 0;        
      decimal.TryParse(((DropDownList)item.FindControl(
             "quantityLister")).SelectedValue, out quantity); 
      if (quantity > 0)
      {   
          string variantId = ((HiddenField)item.FindControl("variantId")).Value;
          orderForm.LineItems.Add(
                 new LineItem(catalogName, productId, variantId, quantity));
          basketUpdated = true; 
      }
}

并将其更改为:

foreach (RepeaterItem item in variantRepeater.Items)
{
      decimal quantity = 0;        
      decimal.TryParse(((DropDownList)item.FindControl(
             "quantityLister")).SelectedValue, out quantity); 
      if (quantity > 0)
      { 
          if (item == null)
              throw new ApplicationException(
                  "Can't locate RepeaterItem");
          object obj = item.FindControl("variantId");
          if (obj == null)
          {
              string sNL = Environment.NewLine;
              StringBuilder sb = new StringBuilder(
                     "Can't locate variantId HiddenField" + sNL +
                     "item Controls are:" + sNL); 
              foreach(Control ctrl in item.Controls)
                  sb.Append(ctrl.Name + sNL);

              throw new ApplicationException(sb.ToString());                
          }
          if (!(obj is HiddenField))
              throw new ApplicationException(
                  "variantId is not a HiddenField");
          HiddenField hfld = obj as HiddenField;

          string variantId = hfld.Value;
          orderForm.LineItems.Add( new LineItem(
                 catalogName, productId, variantId, quantity));
          basketUpdated = true; 
      }
}

再次运行它,看看错误是什么......