ASP.NET Web窗体:调用自定义“是否明智?”;绑定";用户控件中的方法';s财产';谁是二传手?

ASP.NET Web窗体:调用自定义“是否明智?”;绑定";用户控件中的方法';s财产';谁是二传手?,asp.net,data-binding,webforms,properties,Asp.net,Data Binding,Webforms,Properties,我已经多年没有接触过ASP.NET Web表单了,我对它有点生疏了 我目前有一个用户控件,它有一个可编辑文章的列表,这个用户控件包含另一个用户控件(EditArticle.ascx),它在加载时不可见 EditArticle有一个名为Article的属性,它反映了可以编辑的文章 但是,当我触发链接单击并将文章传递给EditArticle的article属性并使其可见时,EditArticle的Page_Load方法在尝试访问article属性时会触发空引用异常。那么在设置属性之前可能会调用Pag

我已经多年没有接触过ASP.NET Web表单了,我对它有点生疏了

我目前有一个用户控件,它有一个可编辑文章的列表,这个用户控件包含另一个用户控件(EditArticle.ascx),它在加载时不可见

EditArticle有一个名为Article的属性,它反映了可以编辑的文章

但是,当我触发链接单击并将文章传递给EditArticle的article属性并使其可见时,EditArticle的Page_Load方法在尝试访问article属性时会触发空引用异常。那么在设置属性之前可能会调用Page_Load

因此,我在属性设置程序中添加了如下内容:

    public NewsArticle Article
    {
        get { return _article; }
        set { _article = value; 
              BindValues();}
    }

    protected void BindValues()
    {
        ArticleTitle.Text = Article.Title;
        ArticleSummary.Text = Article.Lead;
        TextEditor.Text = Article.Article;
    }
它的工作原理是这样的,当显示EditArticle控件时,文本框中会填充相应的数据


正确和适当的方法是什么?

尝试ovverite OnPreRender()。它在页面加载之后调用。

如果您正在寻找一条经验法则,“尽早创建对象,晚些设置其属性(在页面生命周期中)”。因此,父页面应该尽早创建对象(init,load),并将子控件属性设置为较晚(page load,pre-render)

我看到过这样的页面,所有的东西都被塞进了页面生命周期中,直到各种各样的东西都在预渲染中


将事件顺序的图表放在手边很有用,因为母版页、页面和用户控件的页面初始化、加载和预呈现经常会令人惊讶。

这里有一个指向ASP.NET页面生命周期的链接,可以让您更清楚地了解正在发生的事情:

在Page Events下,您可以看到调用了页面的Load事件,并调用了每个控件的onload事件,而onload事件反过来又调用了它的每个子控件的onload事件。因此,在您的情况下,您可能正在进行回发,页面的页面加载被提升,然后用户控件的页面加载被提升(您的用户控件爆炸),然后回发事件被触发(在您设置属性的地方)

您可以尝试在Page的Page Load上设置该属性,并在用户控件的Page PreRender上检索该属性。您可以尝试的另一件事是在用户控件中使用一个public方法,而不是设置article属性,只需调用该方法并将该文章作为参数传入即可