2009-09-04 19 views
1

可以說我有這個用戶控件數據綁定屬性,並讓他們(ASP.Net)的值

public class test : UserControl { 
    public int Count { get; set; } 

    public test() { 
     Count = 3; 
    } 

    public override DataBind() { 
     aRepeater.DataSource = dal.GetObjects(Count); 

     base.DataBind(); 
    } 
} 

我用它我的網頁上這樣

<my:test runat="server" Count="<# something %>" /> 

我現在的問題是在調用base.DataBind()之後,我無法在我的用戶控件中獲得Count的值。我猜想它與自身的數據綁定值有關。該解決方案已經爲此

public override DataBind() { 
    base.DataBind(); // to bind values to self 

    aRepeater.DataSource = dal.GetObjects(Count); 

    base.DataBind(); // to bind new values that is dependent on the the first bind 
} 

它的工作原理,但它似乎並不正確。我的問題是爲什麼這種情況下的最佳做法。

+0

+1 ......很漂亮 「避免巧合編碼」 的問題。 – 2009-09-04 19:21:09

回答

1

只要重寫OnDataBinding方法,而不是的DataBind:

protected override void OnDataBinding(EventArgs e) { 
    base.OnDataBinding(e); 
    aRepeater.DataSource = dal.GetObjects(Count); 
} 

DataBind方法實質上由兩個步驟組成:1)OnDataBinding(),2)的DataBind()爲每個子控制。

1

它是有道理的,因爲Count="<# something %>"發生在DataBind()。我認爲你應該在這種情況下處理所有在DataBind()的數據綁定(並且不要使用頁面綁定方法)。當然,這只是美化代碼的問題 - 僅此而已。

+0

所以沒有像base.BindOnlyMySelf()這樣的方法,我可以稱之爲DataBind中的第一件事,即不會導致子控件對數據綁定,但僅此。 我問的原因是我經常最終做了很多針對nulls的studid檢查,因爲第一個base.DataBind()將所有的子控件都放到了DataBind中,其中一些將首先在第二步中獲取它們的值。 – 2009-09-04 19:30:36

+0

我不認爲有這樣的函數,但是你可以通過不調用'base.DataBind()'來操作'DataBind()'來阻止它到達對象的子節點。 – 2009-09-04 20:00:21

0

您是否必須在您的.ascx文件中設置用戶控件的Count屬性?如何根本沒有Count屬性或者在包含用戶控件的頁面的代碼背後設置Count?

<my:test runat="server" id="test1" /> 

後面的代碼:

//User control code behind. GetCount() returns an int. 
public override DataBind() { 

    aRepeater.DataSource = dal.GetObjects(GetCount()); 
    base.DataBind(); 
} 

//Page that has the user control. 
protected void Page_Load(object sender, EventArgs e) 
{ 
    this.test1.Count = 5;   
} 

//User control code behind. 
public override DataBind() 
{   
    aRepeater.DataSource = dal.GetObjects(this.Count); 
    base.DataBind(); 
}