在回发时未选中asp.net复选框

时间:2017-07-28 12:52:58

标签: c# asp.net

我知道有很多问题要问这个,但我无法在我的案例中找到答案。

案例:我在页面上有一个下拉列表和占位符,并且根据所选的选项,加载相关内容。在内容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。抱歉代码膨胀,请忽略任何遗漏的结束标签,如果有的话。

1 个答案:

答案 0 :(得分:1)

From MSDN)ASP.NET页面框架自动使用视图状态来保存必须在回发之间保留的信息。此信息包括控件的任何非默认值。

视图状态是ASP.NET页面中的存储库,可以存储在回发期间必须保留的值。页面框架使用视图状态在回发之间保持控制设置。这样可以在回发之间保留值而不将它们存储在会话状态

在您将此属性设置为false的情况下,这些控件的值在回发期间丢失了。删除此属性有助于确定下拉选择是否有变化。