2011-08-03 17 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事件。