2010-08-27 55 views
0

好吧,我有一個UserControl。它是一個文本框和其他類似的東西,還有一個保存按鈕。回傳和數據綁定 - 跳過部分頁面生命週期?

我在ItemTemplate的Repeater控件中有這個UserControl。

現在每當我第一次運行它,它似乎工作正常。當我更改文本框的內容並去保存它,但我得到各種空引用錯誤。

最容易混淆的部分是,它似乎創建了我的課程的新實例,但跳過了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

看起來你控制只能被綁定1次,所以ReportID沒有得到正確的價值,並

VAR報告= Data.Report.SingleOrDefault(X => x.ID == ReportID) ;

返回null。

您是否嘗試將ViewID放入視圖狀態?

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; 
    } 
} 
+0

不,var report = ...'返回一個有效的報告對象。問題是當save事件被調用時,它會被調用一個沒有調用Page_Load的類的新實例。另外,我在這個特定的頁面上禁用了ViewState。 – Earlz 2010-08-27 21:56:36

+1

我不明白爲什麼ViewState甚至是需要的,我的意思是這一切都發生在一個單一的請求! – Earlz 2010-08-27 21:58:02