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

回发和数据绑定-跳过页面生命周期的一部分?

  •  0
  • Earlz  · 技术社区  · 14 年前

    好的,我有一个用户控件。里面有一个文本框和其他类似的东西,还有一个保存按钮。

    我在itemtemplate的repeater控件中有这个用户控件。

    现在,每当我第一次运行它时,它似乎工作得很好。当我更改文本框的内容并保存它时,我会得到各种空引用错误。

    最令人困惑的部分是,它似乎创建了我的类的一个新实例,但跳过了 Page_Load 方法等等。这是我在用户控件中的代码示例

        Data.Report ThisReport;
        [Browsable(true)]
        public int ReportID
        {
            get;
            set;
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (ReportID == 0)
            {
                throw new ArgumentException("ReportID can not be 0");
            }
            var report = Data.Report.SingleOrDefault(x => x.ID==ReportID);
            txtName.Text = report.Description;
            ThisReport = report;
        }
    
        protected void btnSave_Click(object sender, EventArgs e)
        {
            var x=ThisReport.Foo; //ThisReport == null here.
        }
    

    它在中继器中使用如下:

    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="ReportsData">
        <ItemTemplate>
            <uc:ReportManager ReportID="<%# ((Data.Report)Container.DataItem).ReportID %>"
            runat="server" />
        </ItemTemplate>
    </asp:Repeater>
    

    为什么它似乎初始化了我的用户控件的新实例?我如何克服这个问题?

    1 回复  |  直到 14 年前
        1
  •  1
  •   mathieu    14 年前

    看起来您的控件只绑定了1次,因此ReportId没有得到正确的值,并且

    var report=data.report.singleOrDefault(x=>x.id==reportid);

    返回空值。

    是否尝试将reportid放入viewstate?

    public override int ReportID 
    {
        get
        {
            if (this.ViewState["ReportID"] == null)
            {
                throw new ArgumentException("ReportID can not be 0");
            }
            return (int)this.ViewState["ReportID"];
        }
        set
        {
            this.ViewState["ReportID"] = value;
        }
    }