0

对 ASP.Net 开发来说非常新,所以希望这不是一个愚蠢的问题。

我有一个带有 DetailsView 控件的网页(框架 3.5),该控件绑定到 sql 并通过存储过程读取记录。AllowPaging = true 在控件上,因为可能会找到多个记录。

它使用文本框控件(用户输入的值)传递给 SP。

文本框有一个正则表达式验证控件,当输入无效时会突出显示。

我这样做如下:

  1. 在文本框中输入有效数据并点击“输入” - 找到记录,因此 DetailsView 向我显示第一条记录以及编号的分页按钮(正确)
  2. 将文本框中的值更改为无效的值,然后从文本框中跳出 - 验证控件突出显示错误(正确)
  3. 按“输入” - 没有任何反应,无效(正确)
  4. 单击 DetailsView 中编号的分页按钮之一 - 发生回发。验证控制没有阻止分页的发生。除了强制用户更正文本框中的无效数据外,我想阻止任何回发/响应。

我确信应该有一种简单的方法来处理这个问题,并且尝试了各种选择但没有到达那里。提前致谢。

4

1 回答 1

1

基本上,当您单击 DetailsView 的任何编号的分页按钮时,不会发生验证。

甚至阻止完整的回发也需要页面检查客户端验证。为了使验证发生在服务器端,调用Page.Validate()DetailsViewPageIndexChanging事件。如果页面无效,则阻止分页发生。

注意 I:您也可以调用Page.Validate()内部 Page_Load事件。您不必DetailsView.PageIndexChanging只在事件中调用此事件。

注意二:如果您只想防止分页发生并且不想使用 PagerTemplates,请使用服务器端验证。回发总是会发生,尽管如果 Page 无效,则不会发生 Paging。

<PagerTemplates>首先在 DetailsView 中使用for pagingCausesValidation并将分页器按钮的属性设置为 true。& CommandArgument的以下设置CommandName将自动处理您的分页。请参阅 MSDN

<pagertemplate>
<asp:LinkButton id="PreviousButton"
                    text=" Previous_"
                    CommandName="Page"
                    CommandArgument="Prev"  CausesValidation="true"
                    runat="Server"/>
 <asp:LinkButton id="NextButton"
                    text="Next_"
                    CommandName="Page"
                    CommandArgument="Next" CausesValidation="true"
                    runat="Server"/> 
</pagertemplate> 

详细信息视图的标记:

<asp:DetailsView  runat="server" ID="EmpDetails"
     OnPageIndexChanging="EmpDetails_PageIndexChanging" ... />

事件处理程序

protected void EmpDetails_PageIndexChanging(object sender, DetailsViewPageEventArgs e)
    {
        Page.Validate();
        if (!Page.IsValid)
            e.Cancel = true;// Prevent the paging 

    }
于 2013-09-05T07:22:33.440 回答