为什么aspx中的这种数据绑定不起作用?

时间:2009-03-10 13:53:34

标签: c# .net asp.net data-binding .net-2.0

我有以下数据源绑定:

MembershipProvider provider = new MembershipProvider();
UserUpdateLogs userUpdateLogs = provider.GetUserUpdateLogs(username);

dgUserUpdateLog.DataSource = userUpdateLogs.Logs;
dgUserUpdateLog.DataBind();

日志 UserUpdateLogEntry 的集合。此类拥有 UserData 属性,UserData包含其他属性。我的aspx:

<Columns>
<asp:BoundColumn DataField="ChangeDate" Visible="true" HeaderText="Date"/>
<asp:BoundColumn DataField="UserData.Sex" HeaderText="Sex" />
<asp:BoundColumn DataField="UserData.Phone" HeaderText="Phone" />
</Columns>

第一行( ChangeDate )似乎效果很好。但是在渲染第二个BoundColumn时,会显示以下错误:

  

具有名称的字段或属性   没有找到'UserData.Sex'   选定的数据来源。

为什么会这样? Aspx不能识别像PropertyA.PropertyB这样的属性串联吗?

我检查了对象,所有属性都有有效数据。

4 个答案:

答案 0 :(得分:3)

您无法以这种方式绑定到子对象的属性。

作为替代方案,您可以使用模板列并使用Eval显示子对象的属性,例如像这样的东西:

<asp:TemplateColumn HeaderText="Sex" Visible="true">
  <ItemTemplate>
    <asp:Literal runat="server" Text='<%# Eval("UserData.Sex") %>' /> 
  </ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Phone" Visible="true">
  <ItemTemplate>
    <asp:Literal runat="server" Text='<%# Eval("UserData.Phone") %>' /> 
  </ItemTemplate>
</asp:TemplateColumn>

答案 1 :(得分:2)

您可以做的一件事是创建一个访问者属性:

public string UserSex
{
    get { return userUpdateLogs.Logs.UserData.Sex; }
}

答案 2 :(得分:1)

C#正在使用反射来查找名为UserData.Sex的属性,它不够智能,无法搜索UserData,然后搜索Sex
所以你的问题的答案是“不”。

有几种方法可以解决这个问题,但更优雅的方法是添加属性UserSex,或者将对象展平为数据表。目前,我想不出一个不打破OO的好方法。

答案 3 :(得分:1)

我不知道该告诉你为什么它不起作用,但是写一个解决方法可能是使用一些linq2objects:

dgUserUpdateLog.DataSource = (from n in userUpdateLogs.Logs select new {n.ChangeDate, Sex=n.Userdata.Sex, Phone=n.UserData.Phone});

然后:

<Columns>
<asp:BoundColumn DataField="ChangeDate" Visible="true" HeaderText="Date"/>
<asp:BoundColumn DataField="Sex" HeaderText="Sex" />
<asp:BoundColumn DataField="Phone" HeaderText="Phone" />
</Columns>