代码之家  ›  专栏  ›  技术社区  ›  Dewfy

在内部.ascx控件和窗体视图中进行数据绑定

  •  3
  • Dewfy  · 技术社区  · 15 年前

    我在窗体视图中有ASCx控件。我想要的是在ascx中使用语法绑定。 这是我的网页:

        <asp:ObjectDataSource runat="server" ID="ods" TypeName="MyDS" SelectMethod="Get" UpdateMethod="Update" DataObjectTypeName="Ent">
        </asp:ObjectDataSource>
        <asp:FormView runat="server" DefaultMode="Edit" ID="fv1" DataSourceID="ods">
            <EditItemTemplate>
                <uc1:WebUserControl ID="WebUserControl1" runat="server" />
                <asp:Button runat="server" CommandName="Update" Text="Update"/>
            </EditItemTemplate>
        </asp:FormView>
    

    这里是webusercontrol.ascx:

    <asp:TextBox ID="txt1" runat="server" Text='<%# Bind("Name") %>' />
    

    在文本框中选择值时,一切正常。bind用预期值填充文本框。但当按下按钮“update”时,objectdatasource的方法update将获取名称为空的ent实例,而输入的文本是预期的。 为了测试,我把文本框放到了.aspx中,一切正常。

    最后,我通过reflector formview进行了反编译,其中extractrowvalues看起来失败了,因为它只在直接子级上迭代。有人知道如何处理儿童绑定吗?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Simon Mourier    12 年前

    抱歉,如果有点晚了:-)

    “绑定”是一种奇怪的野兽。任何地方都没有绑定方法。它只是一个特定的asp.net标记,指示asp.net编译器添加“eval”调用(有一个 Eval 方法),并生成用于双向绑定的特定提取代码隐藏方法。

    但是,此方法仅对配备有 ITemplate 属性(如formview的itemtemplate、edititemtemplate等),并声明为双向可绑定。

    不幸的是,对于用户控件(ascx),没有一种简单的方法可以生成这种方法。

    但是,有 IBindableControl Interface 您可以在用户控件中实现,该控件允许一些集成,尽管它不太自动,声明性也不强,例如:

    webusercontrol.ascx:

    <asp:TextBox ID="txt1" runat="server" Text='<%# Eval("Name") %>' />
    

    (注意绑定是无用的,所以你可以只使用eval)。

    webusercontrol.ascx.cs:

    public partial class WebUserControl : UserControl, IBindableControl
    {
        public void ExtractValues(IOrderedDictionary dictionary)
        {
            dictionary["Name"] = txt1.Text;
        }
    }
    
        2
  •  2
  •   Ed Graham    12 年前

    你必须移动 <%#绑定(“”%> 从用户控件(ASCx)到包含页(ASPx)的语法并使用 性质 在用户控件中获取和设置窗体值。下面的示例是根据 http://oudinia.blogspot.co.uk/2007/12/aspnet-20-and-up-c-user-control-within.html 再加上一些细节,让它更逼真:

    ASCx加价:

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="PaperForm.ascx.cs" Inherits="PaperForm" %>
    
    <asp:ValidationSummary runat="server" HeaderText="<b>Please supply the missing information below.</b>" />
    
    <p class="SectionHeading">Section A: Your Details</p>
    <table border="1" width="100%">
      <tr>
        <td width="220px">Membership number</td>
        <td colspan="3"><asp:TextBox ID="txtMemNo" runat="server" MaxLength="9"></asp:TextBox>
            <asp:RegularExpressionValidator runat="server" ControlToValidate="txtMemNo" Display="Dynamic" Text="Please check your membership number" ValidationExpression="\d{9}"></asp:RegularExpressionValidator>
        </td>
      </tr>
      <tr>
        <td><asp:Label ID="lblFirstName" runat="server">First name</asp:Label></td>
        <td><asp:TextBox ID="txtForename" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator runat="server" ControlToValidate="txtForename" Text="Required"></asp:RequiredFieldValidator>
        </td>
        <td width="110px"><asp:Label ID="lblLastName" runat="server">Last name</asp:Label></td>
        <td><asp:TextBox ID="txtSurname" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator runat="server" ControlToValidate="txtSurname" Text="Required"></asp:RequiredFieldValidator>
        </td>
      </tr>
      ...
    </table>
    
    <script type="text/javascript" language="javascript">
      // perform additional client-side validation in JavaScript
      function ValidateForm()
      {
        // check membership number (via web-service)
        ...
      }
    </script>
    

    ASCx代码:

    public partial class PaperForm : UserControl
    {
        // **public properties representing form data**
        public string MemNo { get { return txtMemNo.Text; } set { txtMemNo.Text = value; } }
        public string Forename { get { return txtForename.Text; } set { txtForename.Text = value; } }
        public string Surname { get { return txtSurname.Text; } set { txtSurname.Text = value; } }
        ...
    
        protected void Page_Load(object sender, EventArgs e)
        {
            // prevent browser caching
            ...
        }
    }
    

    ASPX加价:

    <%--register the user control here--%>
    <%@ Register TagPrefix="UC" TagName="PaperForm" Src="~/Proposals/PaperForm.ascx" %>
    
    <asp:FormView ID="fvPaper" runat="server" DataKeyNames="PprPropID" DataSourceID="tblPprProp" DefaultMode="Insert" Width="780px">    
      <InsertItemTemplate>
    
        <%--insert the user control here, **and bind the database fields to its properties**--%>
        <UC:PaperForm ID="pf" runat="server" MemNo='<%# Bind("MemNo") %>' Forename='<%# Bind("Forename") %>' Surname='<%# Bind("Surname") %>' ... />
        ...
        <%--can use the JavaScript ValidateForm() function defined in the ASCX file--%>
        <asp:Button ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Submit" BackColor="#C2D9EC" OnClientClick="return ValidateForm();" />
      </InsertItemTemplate>
    </asp:FormView>
    
    <%--define the data-source here rather than in the ASCX file--%>
    <asp:SqlDataSource ID="tblPprProp" runat="server" ConflictDetection="CompareAllValues" ConnectionString="<%$ ConnectionStrings:confConnectionString %>" OnInserted="AfterInsertion" 
      InsertCommand="INSERT INTO [tblPprProp] ([MemNo], [Surname], [Forename], ...) VALUES (@MemNo, @Surname, @Forename, ...); SELECT @RowID = SCOPE_IDENTITY()" 
      OldValuesParameterFormatString="original_{0}">
      <InsertParameters>
        <asp:Parameter Name="MemNo" Type="String" />
        <asp:Parameter Name="Surname" Type="String" />
        <asp:Parameter Name="Forename" Type="String" />
        ...
      </InsertParameters>
    </asp:SqlDataSource>
    

    ASPX代码隐藏:

    public partial class PaperProposal : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    
        protected void AfterInsertion(object sender, SqlDataSourceStatusEventArgs e)
        {
            // get Proposal ID
            string rowId = e.Command.Parameters["@RowID"].Value.ToString();
            // get e-mail address from ASCX property
            string address = ((PaperForm)this.fvPaper.FindControl("pf")).Email;
            // send acknowledgement e-mail
            ...
        }
    }
    
    推荐文章