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

发布于 2024-07-15 06:02:05 字数 933 浏览 3 评论 0原文

我有以下数据源绑定:

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 等属性的串联吗?

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

I have this following data source binding:

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

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

Logs is a collection of UserUpdateLogEntry. This class owns the UserData Property, and UserData contains other properties. My 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>

The first row (ChangeDate) seems to work well. But when rendering the second BoundColumn, the following error is shown:

A field or property with the name
'UserData.Sex' was not found on the
selected data source.

Why does it happen? Can't Aspx recognize a concatenation of properties like PropertyA.PropertyB?

I've checked the object and all properties have valid data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不再见 2024-07-22 06:02:05

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

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

You can not bind to properties of sub-objects in that way.

As an alternative, you can use a template column and use Eval to display the properties of the sub-object, e.g. something like this:

<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>
遮了一弯 2024-07-22 06:02:05

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

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

One thing that you can do is create an accessor property:

public string UserSex
{
    get { return userUpdateLogs.Logs.UserData.Sex; }
}
北座城市 2024-07-22 06:02:05

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

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

C# is using reflection to look for a property called UserData.Sex, it is not smart enough to search for UserData and then Sex.
So the answer to your question is 'No'.

There are several ways to get around this, but the more elegant ways are either to add a property UserSex, or to flatten the object into a data table. At the moment, I can't think of a good way that doesn't break OO.

ㄟ。诗瑗 2024-07-22 06:02:05

我不确定如何告诉您为什么它不起作用,但编写此代码的解决方法可能是使用一些 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>

I'm not sure what to tell you about why it won't work, but a workaround to write this might be to use some linq2objects:

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

then:

<Columns>
<asp:BoundColumn DataField="ChangeDate" Visible="true" HeaderText="Date"/>
<asp:BoundColumn DataField="Sex" HeaderText="Sex" />
<asp:BoundColumn DataField="Phone" HeaderText="Phone" />
</Columns>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文