嵌套在FormView中的用户控件中的控件的双向数据绑定不起作用

时间:2010-06-15 12:29:42

标签: asp.net data-binding .net-3.5

我正在尝试对我的用户控件中的控件执行双向数据绑定,该控件托管在FormView模板中:

<asp:ObjectDataSource runat="server" ID="ObjectDataSource" 
    TypeName="WebApplication1.Data" SelectMethod="GetItem" UpdateMethod="UpdateItem">
</asp:ObjectDataSource>
<asp:FormView runat="server" ID="FormView" DataSourceID="ObjectDataSource">
    <ItemTemplate>
        <uc:WebUserControl1 runat="server"></uc:WebUserControl1>
    </ItemTemplate>
    <EditItemTemplate>
        <uc:WebUserControl1 runat="server"></uc:WebUserControl1>
    </EditItemTemplate>
</asp:FormView>

网络用户控件:

<%@ Control Language="C#" ... %>
<asp:TextBox runat="server" ID="TitleTextBox" Text='<%# Bind("Title") %>'>
</asp:TextBox>

当FormView处于View模式时,绑定工作正常但当我切换到Edit模式时,在FormView上调用UpdateItem时,绑定将丢失。我知道这是因为FormView尝试在ObjectDataSource上调用一个没有名为'Title'的参数的更新方法。

我尝试通过实现IBindableTemplate来加载我的用户控件中的控件,直接加载到模板中(就像我以声明方式输入它们一样)。但是,在编辑模式下调用UpdateItem时,传递到模板的container方法的ExtractValues不再包含TextBox。它在视图模式下完成!

我发现了一些与此问题相关的问题,但它们相当过时,并没有提供任何帮助我解决这个问题的答案。

您认为我怎么能解决这个问题?这似乎是一个如此简单的要求,但显然它只不过是......

2 个答案:

答案 0 :(得分:1)

我目前的解决方法虽然相当麻烦,但是要继承FormView类并在其中使用子类控件,实现我自己的数据绑定逻辑(从新属性中获取数据字段名称)而不是使用{{1 }} 句法。显然,后者生成的代码是真正的罪魁祸首,因为它不支持这种嵌套控件方案。

答案 1 :(得分:1)

我最终使用旧的asp include语句

  

&lt; - %include file =“filename” - &gt;

而不是使用用户控件来处理代码重复问题。