我有一个继承的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控件包装在UpdatePanel
和ContentTemplate
内,避免使用AutoPostBack。有人可以解释一下吗?
谢谢
更新 将我的控件设置为AutoPostBack =&#34; true&#34;不是解决方案,因为它会扰乱我的DetailsView控件的其他区域,并且它们也会进行回发。我再次怀疑我必须将formview包装在像UpdatePanel这样的内容中,以完全避免autopostback或完全用JScript进行数据操作,我讨厌。但我可能没有任何选择。
答案 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,因此它们的工作量要大得多。