如何避免 FormView 中的 AutoPostBack?

How to avoid AutoPostBack in a FormView?

我有一个继承的 ASPX 页面,它在 Form 标记中有一个 FormView。

即:

<body style="margin:0px;" bgcolor="skyblue">
    <form id="form1" runat="server" action="Default.aspx">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

    <div style="background-color: #87ceeb; vertical-align: top; text-align: center;">
        <asp:FormView ID="FormView1" runat="server" DefaultMode="Insert" DataSourceID="SqlDataSource1"
            OnItemInserting="FormView_Inserting" OnItemInserted="FormView_Inserted" BackColor="#00C0C0" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px">
            <InsertItemTemplate>
etc
etc

如您所见,我正在使用 Ajax,因为在表单的下方有处理日期的 CalendarExtender 控件。

日期文本框字段都有 AutoPostBack="true",因为程序在服务器端什么都不做。即:没有事件发生。这发生在所有浏览器上——IE、FF 和 Chrome。现阶段不关心Safari等。

重点是我认为我已经陷入 "autopostback hell",其中太多的控件执行验证和其他控件操作将 AutoPostBacks 设置为 "true"。

处理文本框、下拉列表等控件需要在提交表单之前执行操作的情况的更好方法是什么?我认为这是任何形式开发项目中的常见要求。

我在某处 (link) 看到将 FormView 控件包装在 UpdatePanel 中,ContentTemplate 避免使用 AutoPostBack。有人可以解释一下吗?

谢谢

更新 将我的控件设置为 AutoPostBack="true" 不是解决方案,因为它扰乱了我的 DetailsView 控件的其他区域并且它们也执行回发。我再次怀疑我必须将 formview 包装在 UpdatePanel 之类的东西中,以避免完全自动回发或完全在我讨厌的 JScript 中进行数据操作。但我可能别无选择。

这取决于你在做什么类型的验证。如果您正在进行简单的验证(如必填字段或正则表达式验证),那么您可以在 javascript 中进行验证;不需要 post 返回。您甚至可以使用 <asp:RequiredFieldValidator> and <asp:RegularExpressionValidator>

如果您需要根据数据库验证数据,则需要以某种方式调用服务器。如果你不想做一个完整的页面刷新,那么你需要使用AJAX。简单的方法是将每个需要服务器端验证的字段包装在 <UpdatePanel> 中。例如:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"
    ChildrenAsTriggers="True" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" />
        <asp:Label ID="Label1" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

即使 AutoPostBack 为真,它也只会更新 <UpdatePanel> 的内容,因此不会干扰您的其他内容。

请注意,UpdatePanels 仍会 post 您的所有表单数据,每个部分 post 返回。 (好处是响应只​​更新 UpdatePanel 的内容,而不是整个页面。)这意味着如果您有一个包含很多字段的大表单,您可能会发送比您想要的更多的数据电线,因为 AJAX post 返回将 post 每个字段的值返回到服务器,当你真的只需要一个字段的值时。为避免这种情况,您可以使用 page methods 而不是更新面板。但是,它们需要做更多的工作,因为您需要编写一堆 javascript.