我正在尝试对我的用户控件中的控件执行双向数据绑定,该控件托管在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。它在视图模式下完成!
我发现了一些与此问题相关的问题,但它们相当过时,并没有提供任何帮助我解决这个问题的答案。
您认为我怎么能解决这个问题?这似乎是一个如此简单的要求,但显然它只不过是......
答案 0 :(得分:1)
我目前的解决方法虽然相当麻烦,但是要继承FormView类并在其中使用子类控件,实现我自己的数据绑定逻辑(从新属性中获取数据字段名称)而不是使用{{1 }} 句法。显然,后者生成的代码是真正的罪魁祸首,因为它不支持这种嵌套控件方案。
答案 1 :(得分:1)
我最终使用旧的asp include语句
&lt; - %include file =“filename” - &gt;
而不是使用用户控件来处理代码重复问题。