Eval (), может использоваться только в контексте ошибки управления, связанной с данными. Почему так происходит? Что я могу с этим поделать? - PullRequest
2 голосов
/ 29 апреля 2010

Я получаю следующую ошибку, используя asp.net и nHibernate.

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

У меня есть этот список

<asp:ListView ID="CurrentHourList" runat="server" ItemPlaceholderID="itemPlaceholder">
                <LayoutTemplate>
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
                </LayoutTemplate>
                <ItemTemplate>
                    <asp:ImageButton ID="DeleteDateButton" CausesValidation="false" runat="server" CommandName="Delete"
                        ImageUrl="img/delete.png" />
                    &nbsp; <span style="display: none">
                        <asp:Label ID="Id" runat="server" Text='<%# Eval("Id") %>'></asp:Label></span>
                    <asp:Label ID="Date" Text='<%# Eval("Date", "{0:dd MMM yyyy}") %>' runat="server"></asp:Label>
                    <asp:DropDownList ID="MedicalType" runat="server" SelectedValue='<%# Eval("MedicalType.Id") %>'>
                        <asp:ListItem Text="Paid" Value="1"></asp:ListItem>
                        <asp:ListItem Text="Unpaid" Value="2"></asp:ListItem>
                        <asp:ListItem Text="Special" Value="3"></asp:ListItem>
                    </asp:DropDownList>
                    Half-Day:<asp:CheckBox ID="HalfDay" runat="server" Checked='<%# Eval("IsHalfDay") %>' />
                    <br />
                </ItemTemplate>
            </asp:ListView>

и это в моем коде

private void BindData(string id)
    {
        MedLeaveHelper = new MedicalLeaveHelper();
        DTO.MedLeaveDTO dto = MedLeaveHelper.GetMedicalRequest(id);
        if (dto != null)
        {
            EnableForm();
            this.RequestId.Text = dto.Id.ToString();
            this.ddlEmployeeName.SelectedItem.Text = dto.User;
            this.Note.Text = dto.Note;

            this.CurrentHourList.DataSource = MedLeaveHelper.MakeMedicalDays(id);      
            this.CurrentHourList.DataBind();

        }

MakeMedicalDays (id) просто выглядит следующим образом. MedicalDays - это IList

internal IEnumerable MakeMedicalDays(string id)
    {
        int theId = 0;
        if (int.TryParse(id, out theId))
        {
            MedicalRequest r = MedicalRequest.Get(theId);
            return r.MedicalDays;
        }
        return null;
    }

Когда я получаю вызов DataBind (), появляется ошибка. Я ковырялся в трубках, но ничего конкретного не выскочило на меня. Я попытался изменить синтаксис на что-то вроде этого

DataBinder.Eval(Container.DataItem,"id")

и ошибка исчезает, но никакие данные не попадают в мой ListView.

насколько я понимаю, DataBinder.Eval использует отражение для определения моего типа данных, но я не уверен, как решить эту проблему. Любая помощь, которую вы могли бы оказать, была бы великолепна.

Спасибо Jim

1 Ответ

1 голос
/ 01 февраля 2011

Не уверен, что проблема в вашем списке. Я попробовал простое воспроизведение, используя следующий код привязки данных, который отлично работал с ASPX, который вы включили выше:

this.CurrentHourList.DataSource = new[] { new { Id = 1, Date = DateTime.Now, MedicalType = new { Id = 1 }, IsHalfDay = false }, new { Id = 1, Date = DateTime.Now, MedicalType = new { Id = 1 }, IsHalfDay = false } };
this.CurrentHourList.DataBind();

Возможно ли, что ошибка привязки исходит от другого элемента управления (т. Е. Не из списка)?

Если вам нужно использовать декларативную привязку данных к элементу управления или свойству, которое его не поддерживает, вы также можете посмотреть, как создать свой собственный построитель пользовательских выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...