数据绑定到视图模型不起作用

时间:2012-07-18 18:21:51

标签: asp.net ajax data-binding ajaxcontroltoolkit modalpopupextender

我的Web窗体上有一个AJAX Accordion Control。我在手风琴窗格内有一个Asp.Net标签。我想将标签的text属性数据绑定到我运行的View Model。

标签文本属性似乎永远不会与视图模型数据绑定?如果我将标签拉出手风琴窗格,但不在里面,它会完美地工作吗?

这有效:

<asp:Label runat="server" Text='<%# Model.Program.NameVisible.ToString() %>' />

这不是:

<asp:AccordionPane ID="AccordionPane2" runat="server">
    <Header>
        Advanced Search
    </Header>
    <Content>
        <asp:Panel ID="pnlAdvancedSearch" runat="server">
            <table cellpadding="2" cellspacing="0" width="100%" runat="server">
                <tr>
                    <td align="right">
                        <asp:Label runat="server" Text='<%# Model.Program.NameVisible.ToString() %>' />                                
                    </td>
                </tr>
            </table>
        </asp:Panel>
    </Content>
</asp:AccordionPane>

任何想法或解决方法?

感谢。

更新:当嵌套在任何AJAX控件中时,这显然不起作用。我在ModalPopUpExtender中也没有发生绑定问题。

2 个答案:

答案 0 :(得分:2)

DataBind控件的Accordion不会为每个明确定义的自定义DataBind控件调用AccordionPane。相反,它将根据Jupaol提供的答案使用模板构建窗格。

在您的示例中,您需要在要绑定的控件上显式调用DataBind,或者在将调用所有子项上的数据绑定的父级上调用pnlAdvancedSearch.DataBind()。因此,在您的示例中,调用<asp:Label>就足以绑定您的标签以及搜索面板中的任何其他控件。

我觉得值得补充的是,用简单的方式完全替换<%: Model.Program.NameVisible.ToString() %> 控件似乎更简单:

{{1}}

答案 1 :(得分:1)

我刚刚找到了一种方式

首先,Accordion控件确实支持数据绑定:

  

手风琴也可以是数据绑定。只需通过DataSource或DataSourceID属性指定数据源,然后在HeaderTemplate和ContentTemplate属性中设置数据项。

Source

示例:

输出

enter image description here

ASPX

<ajax:Accordion runat="server" ID="ajax22"  RequireOpenedPane="true"
    HeaderCssClass="accordionHeader"
    HeaderSelectedCssClass="accordionHeaderSelected"
    ContentCssClass="accordionContent"
>
    <ContentTemplate>
        Even cooler content
        <br />
        <asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "Something") %>' ID="lbl" runat="server" />
    </ContentTemplate>
    <HeaderTemplate>
        Cool header
        <br />
        <asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "Something") %>' ID="lbl" runat="server" />
    </HeaderTemplate>
</ajax:Accordion>

ASPX代码背后

您需要指定Accordion.DataSource属性,此属性仅支持IEnumerableIListSource,因此您需要按如下方式绑定您的手风琴:

this.ajax22.DataSource = new[] { this.Model };

this.DataBind();

模型

public class MyModel
{
    public MyModel()
    {
        this.Something = "plop!";
    }

    public string Something { get; set; }
}

绑定Accordion时,会创建一些AccordionPanes来表示每个绑定项目。

如果您指定其他自定义AccordionPanes,则在应用上述指定的绑定时,这些AccordionPanes将被忽略且不会呈现。

相关问题