代码之家  ›  专栏  ›  技术社区  ›  kitsune

NET Web窗体:在用户控件的属性设置器中调用自定义“绑定”方法是否明智?

  •  1
  • kitsune  · 技术社区  · 16 年前

    我已经好几年没碰过ASP.NET的网页表单了,我有点生疏了。

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

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

    但是,当我触发链接单击并将文章传递到EditArticle的文章属性并使其可见时,EditArticle的Page_Load方法在尝试访问文章属性时会触发空引用异常。所以在设置属性之前可能会调用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控件时,文本框中会填充适当的数据。

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   MatthewMartin muthu    16 年前

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

    我看到过这样的页面,在页面生命周期中,所有的东西都被不断地塞进,直到各种各样的东西都被预先呈现出来。

    将事件顺序图表保存在手边是很有用的,因为通常情况下,母版页、页和用户控件的page init、load和pre-render的交错会令人惊讶。

        2
  •  1
  •   Jonas Stawski    16 年前

    ASP.NET Page Life Cycle

    在页面事件下,您可以看到调用了页面的加载事件,并调用每个控件的onload事件,而onload事件又反过来调用其每个子控件的onload事件。因此,在您的案例中,您可能正在执行回发,并且页面的页面加载被提升,然后用户控件的页面加载被提升(您的用户控件被炸毁),然后回发事件被触发(在您设置属性的位置)。

    可以尝试在页的页加载上设置属性,并在用户控件的页预呈现上检索该属性。您可以尝试的另一件事是在用户控件中使用公共方法,而不是设置项目属性,只需调用该方法并将项目作为参数传入。

        3
  •  0
  •   JayJay    16 年前

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