为什么aspx中的数据绑定不起作用?
我有以下数据源绑定:
MembershipProvider provider = new MembershipProvider();
UserUpdateLogs userUpdateLogs = provider.GetUserUpdateLogs(username);
dgUserUpdateLog.DataSource = userUpdateLogs.Logs;
dgUserUpdateLog.DataBind();
Logs 是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 等属性的串联吗?
我已经检查了该对象,所有属性都有有效数据。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您不能以这种方式绑定到子对象的属性。
作为替代方案,您可以使用模板列并使用 Eval 显示子对象的属性,例如:
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:
您可以做的一件事是创建一个访问器属性:
One thing that you can do is create an accessor property:
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 forUserData
and thenSex
.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.
我不确定如何告诉您为什么它不起作用,但编写此代码的解决方法可能是使用一些 linq2objects:
然后:
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:
then: