如何在FormView中避免AutoPostBack?

时间:2015-05-26 01:58:55

标签: c# asp.net autopostback

我有一个继承的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等。

关键是我认为我已陷入&#34; autopostback hell&#34;,其中太多控件进行验证和其他控制操作将AutoPostBacks设置为&#34; true&#34;。

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

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

谢谢

更新 将我的控件设置为AutoPostBack =&#34; true&#34;不是解决方案,因为它会扰乱我的DetailsView控件的其他区域,并且它们也会进行回发。我再次怀疑我必须将formview包装在像UpdatePanel这样的内容中,以完全避免autopostback或完全用JScript进行数据操作,我讨厌。但我可能没有任何选择。

1 个答案:

答案 0 :(得分:1)

这取决于您正在进行何种验证。如果您正在进行简单验证(如必填字段或正则表达式验证),那么您可以在javascript中进行验证;不需要回复帖子。您甚至可以使用<asp:RequiredFieldValidator><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仍然会发回每个部分帖子的所有表单数据。 (它的好处是响应只​​更新UpdatePanel的内容,而不是整个页面。)这意味着如果你有一个包含大量字段的大表单,你可能会发送比你想要的更多的数据电线,因为AJAX回发后会将每个字段的值发回服务器,当你真正只需要一个字段的值时。为避免这种情况,您可以使用page methods代替更新面板。但是,由于你需要编写一堆javascript,因此它们的工作量要大得多。