Почему эта привязка данных в aspx не работает? - PullRequest
0 голосов
/ 10 марта 2009

У меня есть следующая привязка источника данных:

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 ]

3 голосов
/ 10 марта 2009

Таким способом нельзя привязать свойства подобъектов.

В качестве альтернативы вы можете использовать столбец шаблона и использовать 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 голосов
/ 10 марта 2009

Одна вещь, которую вы можете сделать, это создать свойство accessor:

public string UserSex
{
    get { return userUpdateLogs.Logs.UserData.Sex; }
}
1 голос
/ 10 марта 2009

Я не уверен, что вам сказать, почему это не сработает, но для обхода этой проблемы можно использовать некоторые объекты linq2:

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>
1 голос
/ 10 марта 2009

C # использует отражение для поиска свойства с именем UserData.Sex, оно недостаточно умен для поиска UserData, а затем Sex.
Таким образом, ответ на ваш вопрос «Нет».

Есть несколько способов обойти это, но более элегантные способы - это либо добавить свойство UserSex, либо сгладить объект в таблице данных. На данный момент я не могу придумать хороший способ, который не сломал бы ОО.

...