我知道有很多问题要问这个,但我无法在我的案例中找到答案。
案例:我在页面上有一个下拉列表和占位符,并且根据所选的选项,加载相关内容。在内容3中,我有一个复选框,不会回发正确的检查状态。< / p>
问题是下拉列表会进行回发,除此之外,我还会在加载内容时按下按钮进行另一次回发。
示例案例:
家长控制:
public class MyAccount : BaseAuthControl
{
protected PlaceHolder phContentMA;
protected override void Page_Load(object sender, EventArgs e)
{
base.Page_Load(sender, e);
LoadStage(3);
}
private void LoadStage(int index)
{
switch (index)
{
case 1:
var oh = Page.LoadControl("OrderHistory");
phContentMA.Controls.Add(oh);
break;
case 2:
var st = Page.LoadControl("Statement");
phContentMA.Controls.Add(st);
break;
case 3:
var pa = Page.LoadControl("ProductAnalysis");
phContentMA.Controls.Add(pa);
break;
case 4:
var bo = Page.LoadControl("BackOrders");
phContentMA.Controls.Add(bo);
break;
}
}
protected void cbMyAccount_SelectedIndexChanged(object sender, EventArgs e)
{
LoadStage(cbMyAccount.SelectedIndex);
}
}
父.ascx:
<%@ Control Language="c#" Codebehind="MyAccount.ascx.cs" Inherits="Controls.MyAccount"%>
Action: <asp:dropdownlist id="cbMyAccount" runat="server" EnableViewState="False" AutoPostBack="True" OnSelectedIndexChanged="cbMyAccount_SelectedIndexChanged" />
<asp:PlaceHolder id="phContentMA" runat="server"></asp:PlaceHolder>
有问题的儿童控制:
public class ProductAnalysis : BaseAuthControl
{
protected Repeater rptrProducts;
protected Literal ltStockCode;
protected Literal ltStockDesc;
protected Literal ltQtySold;
protected Literal ltAmount;
protected HyperLink lnkAddToCart;
protected CheckBox chkMultiple;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var saleStats = // results from the database;
rptrProducts.DataSource = saleStats;
rptrProducts.DataBind();
}
protected void rptrProducts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;
var saleItem = e.Item.DataItem as TSaleStat;
if (saleItem == null) return;
var stockItem = GetItem(saleItem.StockCode);
if (stockItem == null) return;
if (CCUtils.AssignRepeaterControl(e, out ltStockCode, "ltStockCode"))
ltStockCode.Text = stockItem.StockCode;
if (CCUtils.AssignRepeaterControl(e, out ltStockDesc, "ltStockDesc"))
ltStockDesc.Text = stockItem.ShortDesc;
if (CCUtils.AssignRepeaterControl(e, out ltQtySold, "ltQtySold"))
ltQtySold.Text = saleItem.QuantitySold.ToString(CultureInfo.InvariantCulture);
if (CCUtils.AssignRepeaterControl(e, out ltAmount, "ltAmount"))
ltAmount.Text = CCUtils.GetCurrencyPrice(Session, (decimal)saleItem.TotalPrice);
if (CCUtils.AssignRepeaterControl(e, out lnkAddToCart, "lnkAddToCart"))
lnkAddToCart.NavigateUrl = stockItem.BuildBuyNowLink();
if (CCUtils.AssignRepeaterControl(e, out lnkAddToCart, "lnkAddToCart"))
lnkAddToCart.NavigateUrl = stockItem.BuildBuyNowLink();
if (CCUtils.AssignRepeaterControl(e, out chkMultiple, "chkMultiple"))
{
chkMultiple.Attributes.Add("value", stockItem.StockCode);
}
}
protected void BtnClick(object sender, EventArgs e)
{
var stockCodes = new List<string>();
if (!rptrProducts.IsAssigned()) return;
foreach (RepeaterItem repeaterItems in rptrProducts.Items)
{
foreach (var childControl in repeaterItems.Controls)
{
var checkBox = childControl as CheckBox;
if (checkBox == null) continue;
if (checkBox.Checked) // always false here
stockCodes.Add(checkBox.Attributes["value"]);
}
}
var test = stockCodes;
}
}
孩子.ascx代码:
<%@ Control Language="c#" Codebehind="ProductAnalysis.ascx.cs" Inherits="Controls.ProductAnalysis" %>
<div id="viewProductsPurchased">
<asp:Repeater runat="server" ID="rptrProducts" OnItemDataBound="rptrProducts_ItemDataBound" EnableViewState="True">
<HeaderTemplate>
<table>
<thead>
<tr>
<th>Stock Code</th>
<th>Stock Description</th>
<th>Total Sold</th>
<th>Total Value</th>
<th colspan="2"><asp:Button runat="server" CssClass="uppercase" ID="Btn" OnClick="BtnClick" Text="Add selected to cart" UseSubmitBehavior="False" /></th> <!-- another postback with this button -->
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Literal runat="server" ID="ltStockCode" />
</td>
<td>
<asp:Literal runat="server" ID="ltStockDesc" />
</td>
<td>
<asp:Literal runat="server" ID="ltQtySold" />
</td>
<td>
<asp:Literal runat="server" ID="ltAmount" />
</td>
<td>
<asp:HyperLink runat="server" Text="Add" CssClass="buttonlink" ID="lnkAddToCart" />
</td>
<td>
<asp:CheckBox runat="server" ID="chkMultiple" /> <!-- this checkbox never checked on postback -->
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
我已尝试将代码包装到!Page.IsPostBack
:
if (!Page.IsPostBack) {
var saleStats = // results from the database;
rptrProducts.DataSource = saleStats;
rptrProducts.DataBind();
}
在这种情况下,由于从下拉列表回发,所以没有加载任何内容。
我愿意接受任何建议,修正或变通办法来解决这个问题 - 花了太多时间。
P.S。抱歉代码膨胀,请忽略任何遗漏的结束标签,如果有的话。
答案 0 :(得分:1)
(From MSDN)ASP.NET页面框架自动使用视图状态来保存必须在回发之间保留的信息。此信息包括控件的任何非默认值。
视图状态是ASP.NET页面中的存储库,可以存储在回发期间必须保留的值。页面框架使用视图状态在回发之间保持控制设置。这样可以在回发之间保留值而不将它们存储在会话状态
中在您将此属性设置为false
的情况下,这些控件的值在回发期间丢失了。删除此属性有助于确定下拉选择是否有变化。