【问题标题】:ASP.NET user control property in a repeater is null after postback转发器中的 ASP.NET 用户控件属性在回发后为空
【发布时间】:2019-06-22 04:37:20
【问题描述】:

似乎已经发布了几个关于此的问题,但似乎没有一个可以完全解决我的问题。我在中继器中有一个用户控件。用户控件有一个只有一个 getter/setter 的公共属性。数据绑定在初始页面加载时发生得很好,但是从下拉菜单中选择过滤器时,第一个转发器绑定正常,但包含用户控件的第二个转发器显示该属性为 null。因此,进入实际代码:

我的两个中继器看起来像这样:

<asp:Repeater ID="rptTransactionVisual" runat="server" OnItemDataBound="rptTransactionVisual_ItemDataBound">
    <ItemTemplate>
        <%#Eval("TransactionAmount")%> 

^--我将其用于完整性检查 - 它总是会得到一个值,即使下面的事务接收到一个空值,所以我知道它正在获取一个数据源并被数据绑定

        <st:visual transaction="<%#(Transaction)(Container.DataItem)%>" runat="server" />
    </ItemTemplate>
</asp:Repeater>

<asp:Repeater ID="rptTransactions" runat="server" OnItemDataBound="rptTransactions_ItemDataBound" OnDataBinding="rptTransactions_DataBinding">
    <ItemTemplate>
        <tr>
            <td><%#DataBinder.Eval(Container.DataItem, "TransactionDate", "{0:MM/dd/yyyy}")%></td>
            <td><asp:Literal ID="ltlTransactionAmount" runat="server" /></td>
            <td><asp:Literal ID="ltlClient" runat="server" /></td>
            <td><asp:Literal ID="ltlTransactionType" runat="server" /></td>
            <td><asp:Literal ID="ltlSector" runat="server" /></td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

我将顶部转发器的值绑定到第二个转发器的数据源,因为它们是相同的:

protected void rptTransactions_DataBinding(object sender, EventArgs e)
    {
        rptTransactionVisual.DataSource = rptTransactions.DataSource;
        rptTransactionVisual.DataBind();
    }

这是来自用户控件的相关代码,最初运行良好,但过滤后,事务始终为空;

public Transaction transaction { get; set; }

    protected override void OnLoad(EventArgs e)
     {
        base.OnLoad(e);

        if (transaction == null) return;
....

这是过滤的代码:

protected void ddTransactionType_SelectedIndexChanged(object sender, EventArgs e)
    {
        var transactions = getChildPages().Where(p => p.TransactionType == ddTransactionType.SelectedValue).ToList<TransactionPage>();
        }

        rptTransactions.DataSource = transactions;
        rptTransactions.DataBind();
       //databinding happens always for the list repeater, and I do see the visual repeater being databound with the correct datasource
    }

在这件事上我已经把头撞到了墙上。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我仍然不知道为什么原来的回发后为空,但我确实通过对 Visual repeater ItemDataBound 事件的一点修改来解决它。

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                TransactionPage transaction = (TransactionPage)e.Item.DataItem;
                TransactionPagePartial visual = (TransactionPagePartial)Page.LoadControl("~/Views/Pages/Partials/TransactionPagePartial.ascx");
                visual.transaction = transaction;
                rptTransactionVisual.Controls.Add(tombstone);
            }
    

    【讨论】:

    • 谢谢,这是正确的答案。您必须动态加载控件。
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2011-03-14
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多