【问题标题】:Why this data binding in aspx does not work?为什么aspx中的这个数据绑定不起作用?
【发布时间】:2009-03-10 13:53:34
【问题描述】:

我有以下数据源绑定:

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

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

LogsUserUpdateLogEntry 的集合。此类拥有 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 之类的属性的串联吗?

我已经检查了对象并且所有属性都有有效数据。

【问题讨论】:

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


    【解决方案1】:

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

    作为替代方案,您可以使用模板列并使用 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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我不知道该告诉你为什么它不起作用,但编写它的解决方法可能是使用一些 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>
          

          【讨论】:

          • 我使用的是 .net 2.0,否则它可能是一个很好的解决方法,谢谢!
          猜你喜欢
          • 2010-10-26
          • 2014-05-31
          • 2012-07-05
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          相关资源
          最近更新 更多