在嵌套中继器的页脚中查找数量框控件时出现空引用错误。执行 OnItemCommand 函数时会发生错误(而不是数据绑定到中继器时,这是我之前遇到但已修复的问题)。
我是新手,所以我不明白这一切,我正在努力解决它,但我不知道为什么在 foreach 重复项中 FindControl (msdn 说包括标题和转发器的页脚!)在该转发器的页脚中找不到控件。它快把我逼疯了。
请帮忙!
更新:我更改了代码,但仍然遇到同样的问题——我错误地引用了 ddl,并且我不断得到对象引用未设置为对象的实例。
这是代码:
。网:
<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" />
<asp:Literal ID="collectionName" runat="server" />
–
<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