2011-08-03 59 views
0

將數據綁定控件綁定到不同的環境中時,使用數據綁定控件綁定公共控件的中繼器會遇到問題。ASP.Net數據綁定環境問題

舊機器問題。

我們有以下轉發:

<web:Repeater ID="rptVehicles" runat="server" DataType="Entities.VehicleSummary" OnItemDataBound="rptItemList_OnItemDataBound"> 
<ItemTemplate> 
    <div style="display:none"> 
     <p>Container Item = <%# (Container.DataItem == null) ? "null" : "not null" %></p> 
     <p>Container Item Id = <%# (Container.DataItem.ID == null) ? "null" : "not null" %></p> 
     <p>Container Item Id = <%# Container.DataItem.ID %></p> 
    </div> 
    <common:VehicleItem runat="server" ID="itmVehicle" DataSource="<%# Container.DataItem %>" ImageDefinition="<%# this.ImageDefinition %>" /> 
</ItemTemplate> 
</web:Repeater> 

和車輛資料的用戶控件的內容:

<div class="m-vitem"> 
<div style="display:none"> 
    <p>DataSourceSet = <%# this.DataSourceSet %></p> 
    <p>Item DataSource = <%# (this.DataSource == null)? "null" : "not null" %></p> 
</div> 

在本地的數據源setter方法被調用傳遞車輛摘要實體。

DataSourceSet屬性在DataSource屬性設置器中設置爲true,本地輸出在測試其false時是true。

我們在本地和測試環境中使用不同的.Net版本,是否有人知道版本之間的數據綁定處理和可以做什麼之間是否有區別,還是我吠叫錯誤的樹?

LOCAL - Microsoft .NET Framework版本:2.0.50727.4961; ASP.NET版本:2.0.50727.4955 測試 - Microsoft .NET Framework版本:2.0.50727.3082; ASP.NET版本:2.0.50727.3082

+0

你在本地與測試中獲得Container.DataItem的值是什麼?他們是一樣的嗎? 另外,中繼器在測試機器上綁定的位置在哪裏?你確定它確實被綁定到數據? – arviman

+0

它綁定在pre_render上,我也將它移動到了加載狀態。同樣的結果。如果我將整個Vehicle Item控件從普通用戶控件移動到Repeater的ItemTemplate中,它將起作用,但我們試圖促進代碼和控件的重用。 中繼器項目模板中的「容器項目ID」正在呈現,因此它正在進行數據綁定。 Container Data Item的值在本地和測試中是相同的。相同的DB服務器只是不同的Web服務器,他們也輸出相同的車輛ID。 – Marc

+0

我不完全確定這是爲什麼發生以外的版本問題,但您是否嘗試調用'base.OnDataBinding(EventArgs.Empty);'從您的控件中重寫的'OnDataBinding'方法? – arviman

回答

0

看起來您的基本屬性中正在執行設置的代碼沒有被調用,因爲您的車輛實體上的覆蓋屬性。將基本屬性標記爲虛擬僅使編譯器選擇哪些版本的屬性需要在運行時使用。這並不意味着基本屬性設置器的代碼在子類屬性設置器之前/之後運行。

另外,在屬性中實際做任何'設置'是沒有意義的,你最好想把它移到基類構造函數中,如果你從你的基類構造函數中調用它,它將被執行對象的構造函數。另外,但不太理想,你可以在你的重寫屬性中執行設置。

將設置代碼移動到OnDataBinding會適合您,因爲只要您設置中繼器的DataSource屬性,就會自動觸發DataBind事件。