【问题标题】:Two-way data binding of controls in a user control nested inside a FormView doesn't work嵌套在 FormView 内的用户控件中控件的双向数据绑定不起作用
【发布时间】:2011-03-03 23:18:10
【问题描述】:

我正在尝试对我的用户控件中的控件执行双向数据绑定,该控件托管在 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 处于查看模式时绑定工作正常,但当我切换到编辑模式时,在 FormView 上调用 UpdateItem 时,绑定丢失。我知道这一点是因为 FormView 尝试在没有名为“Title”的参数的 ObjectDataSource 上调用更新方法。

我尝试通过实现IBindableTemplate 来解决这个问题,将我的用户控件中的控件直接加载到模板中(就像我以声明方式输入它们一样)。但是,当在编辑模式下调用 UpdateItem 时,传递给模板的 ExtractValues 方法的 container 不再包含 TextBox。在查看模式下确实如此!

我在 SO 上发现了一些与此问题相关的问题,但它们已经过时,并且没有提供任何帮助我解决此问题的答案。

您认为我可以如何解决这个问题?这似乎是一个如此简单的要求,但显然不是这样......

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我结束了,使用旧的 asp 包含语句

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

      【讨论】:

      • 欢迎来到 Stack Overflow。这似乎不是 OP 问题的答案
      • 这可能是真的,但它是相关的。我发现这个答案既简单又有用。
      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2018-03-29
      • 2014-12-07
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多