我的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中也没有发生绑定问题。
答案 0 :(得分:2)
DataBind
控件的Accordion
不会为每个明确定义的自定义DataBind
控件调用AccordionPane
。相反,它将根据Jupaol提供的答案使用模板构建窗格。
在您的示例中,您需要在要绑定的控件上显式调用DataBind
,或者在将调用所有子项上的数据绑定的父级上调用pnlAdvancedSearch.DataBind()
。因此,在您的示例中,调用<asp:Label>
就足以绑定您的标签以及搜索面板中的任何其他控件。
我觉得值得补充的是,用简单的方式完全替换<%: Model.Program.NameVisible.ToString() %>
控件似乎更简单:
{{1}}
答案 1 :(得分:1)
我刚刚找到了一种方式
首先,Accordion
控件确实支持数据绑定:
手风琴也可以是数据绑定。只需通过DataSource或DataSourceID属性指定数据源,然后在HeaderTemplate和ContentTemplate属性中设置数据项。
示例:
<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>
您需要指定Accordion.DataSource
属性,此属性仅支持IEnumerable
或IListSource
,因此您需要按如下方式绑定您的手风琴:
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
将被忽略且不会呈现。