不为用户控制触发RaisePostBackEvent

时间:2012-03-28 22:31:55

标签: asp.net user-controls

我创建了一个自定义用户控件,用于扩展GridView的功能。它继承自UserControl并实现IPostBackEventHandler。

我遇到的问题是框架不会调用IPostBackEventHandler.RaisePostBackEvent函数SOMETIMES。我已将此控件放在多个页面上,在某些页面上它可以正常工作,而在某些页面上却没有。我检查了Request [“__ EVENTTARGET”]并验证它等于控件的UniqueID,但仍然没有调用RaisePostBackEvent。

是否有人知道可能无法调用RaisePostBackEvent的原因?

以下是我的用户控件的代码:

namespace Warrior.PL.Controls 
{ 
    /// <summary> 
    /// A GridView that supports filter fields at the top of each column. 
    /// </summary> 
    [ParseChildren(ChildrenAsProperties = true)] 
    [ToolboxData("<{0}:FilterableGridView runat=\"server\"></{0}:FilterableGridView>")] 
    public partial class FilterableGridView : UserControl, IPostBackEventHandler 
    { 
    ... 
        #region IPostBackEventHandler Members 

        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) 
        { 
            if (eventArgument != null && eventArgument.StartsWith("Filter")) 
            { 
                OnFiltering(new GridViewFilterEventArgs()); // This is a function that I created 
            } 
        } 

        #endregion 
    ... 
    } 
} 

以下是其中一个有效页面的控件实现:

<warrior:FilterableGridView ID="gvItemCert" runat="server" AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" CellPadding="4" CssClass="GridView" 
    OnPageIndexChanging="gvItemCert_PageIndexChanging" OnRowDataBound="gvItemCert_RowDataBound" OnSorting="gvItemCert_Sorting" OnFiltering="gvItemCert_Filtering" PageSize="100"> 
    ... 
</warrior:FilterableGridView> 

以下是页面上无法正常工作的实现:

<warrior:FilterableGridView ID="gvEquipSN" runat="server" AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" CellPadding="4" CssClass="GridView" EnableViewState="false" 
    OnPageIndexChanging="gvEquipSN_PageIndexChanging" OnRowDataBound="gvEquipSN_RowDataBound" OnSorting="gvEquipSN_Sorting" OnFiltering="gvEquipSN_Filtering" PageSize="20"> 
    ... 
</warrior:FilterableGridView> 

我看到的唯一区别是不起作用的那个有EnableViewState =“false”。不过,我已经将此排除在外,因为设置EnableViewState =“true”对任何事都没有帮助。

另外,我在两个页面都使用AJAX。

2 个答案:

答案 0 :(得分:1)

为了阅读本文的任何人的兴趣,我能够通过强制ASP.NET框架通过调用Page.RegisterRequiresRaiseEvent在每个回发上调用RaisePostBackEvent来解决这个问题:

protected override void OnInit(EventArgs e)
{
    Page.RegisterRequiresRaiseEvent(this);

    base.OnInit(e);
}

然后我必须修改RaisePostBackEvent以检查事件目标:

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
    string eventTarget = Request["__EVENTTARGET"];
    if (eventTarget == UniqueID)
    {
        // eventArgument is null so we have to retrieve it ourselves
        eventArgument = Request["__EVENTARGUMENT"];
        if (eventArgument.StartsWith("Filter"))
        {
            OnFiltering(new GridViewFilterEventArgs());
        }
    }
}

我真的不喜欢这个解决方案,因为我似乎正在修复症状,而不是问题。但它现在可以使用。

答案 1 :(得分:0)

事实证明,如果在同一页面上有两个这样的控件,之前的解决方案不起作用,因为显然只允许页面上的一个控件调用Page.RegisterRequiresRaiseEvent。此外,如果控件调用Page.RegisterRequiresRaiseEvent,则页面上的其他任何控件都不会调用它们的RaisePostBackEvent函数。

实际上,这是我的全部问题:我在页面上有另一个控件,调用了Page.RegisterRequiresRaiseEvent,所以我的FilterableGridView从未调用它的RaisePostBackEvent函数!

我知道所有这些都必须有其他东西......