1

假设我有一个带有几个按钮的用户控件。我想知道是哪一个导致了回发,使用这种方法:

public static Control GetPostBackControl(Page page)
    {
        Control control = null;

        string ctrlname = page.Request.Params.Get("__EVENTTARGET");
        if (ctrlname != null && ctrlname != string.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        else
        {
            foreach (string ctl in page.Request.Form)
            {
                Control c = page.FindControl(ctl);
                if (c is System.Web.UI.WebControls.Button)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }

这就是我所说的:

string btn = GetPostBackControl(this.Page).ID;

我得到“对象引用未设置为对象的实例。 ”我现在知道问题出在我使用this.Page的事实,它代表父页面

如何引用我所在的用户控件?(不是父页面)以便它可以使用方法来查找导致回发的按钮?

感谢您的帮助。

编辑

这两个按钮都位于用户控件内。GetPostBackControl()也在用户控件的代码隐藏中。

4

1 回答 1

2

我对你给定的代码做了一个简单的例子,结果很好。也许您确实错过了检查 Page.IsPostBack?显然,只有在有 postBack 时才会有 postBackControl ......

@Buttons - 它们将被渲染,<input type="submit">因此它们不会出现在___EVENTTARGET. 这就是Ryan Farlay在他的博客中写道的原因

然而,你仍然可以得到它,只是以不同的方式。由于按钮(或输入)是导致表单提交的原因,因此它与来自提交表单的所有其他值一起添加到 Form 集合中的项目中。[...] 如果您要在表单集合中查找任何按钮,那么这将是导致回发的原因(假设它是导致页面提交的按钮)。如果您首先检查 __EVENTTARGET,那么 如果那是空白的,请在 Form 集合中查找一个按钮,然后您会发现导致回发的原因

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        Control postBackControl = GetPostBackControl(this.Page);
        Debug.WriteLine("PostBackControl is: " + postBackControl.ID);
    }
}
public static Control GetPostBackControl(Page page)
{
    Control control = null;

    string ctrlname = page.Request.Params.Get("__EVENTTARGET");
    if (ctrlname != null && ctrlname != string.Empty)
    {
        control = page.FindControl(ctrlname);
    }
    else
    {
        foreach (string ctl in page.Request.Form)
        {
            Control c = page.FindControl(ctl);
            if (c is System.Web.UI.WebControls.Button)
            {
                control = c;
                break;
            }
        }
    }
    return control;
}
于 2013-02-14T19:30:59.610 回答