3

我正在尝试验证两个复选框。必须检查其中之一才能使表格有效。我想使用 CustomValidator 控件,并在服务器上进行验证。

(此 .ascx 页面是显示在不同 .aspx 页面上的表单。)

首先,我在 .ascx 页面上添加了复选框和 CustomValidator 控件。像这样:

<tr>
        <td colspan="3">
            <input type="checkbox" runat="server" name="EmailCourse" class="" id="EmailCourse" value="" />
                Email course
<asp:CustomValidator id="CustomValidator1" runat="server" ErrorMessage="No checkbox checked" 
                 OnServerValidate="validateCheckBoxes_ServerValidate">
                </asp:CustomValidator>

        </td>
    </tr>
<tr>
        <td colspan="3">
            <input type="checkbox" runat="server" name="SpecialReport" class="" id="SpecialReport"  value="" />
                Special report
        </td>
    </tr>

然后,我在 .ascx.cs 页面的代码隐藏中添加了 validateCheckBoxes_ServerValidate 函数,如下所示:

            protected void validateCheckBoxes_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (!EmailCourse.Checked && !SpecialReport.Checked)
                args.IsValid = false;
            else
                args.IsValid = true;

    }

当我尝试在本地站点上打开使用此表单的页面以查看其外观时,我收到一个错误,如下所示:

说明:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。

编译器错误消息:CS1061:“ASP.common_controls_specialreportform_ascx”不包含“validateCheckBoxes_ServerValidate”的定义,并且没有扩展方法“validateCheckBoxes_ServerValidate”接受“ASP.common_controls_specialreportform_ascx”类型的第一个参数(您是否缺少 using 指令或装配参考?)

和:

错误 CS1061:“ASP.common_controls_specialreportform_ascx”不包含“validateCheckBoxes_ServerValidate”的定义,并且没有可以找到接受“ASP.common_controls_specialreportform_ascx”类型的第一个参数的扩展方法“validateCheckBoxes_ServerValidate”(您是否缺少 using 指令或程序集引用? )

有谁知道这个错误的原因是什么?我是 asp.net 的新手,遇到了麻烦。

谢谢!

4

4 回答 4

2

您将 validateCheckBoxes_ServerValidate 放在 *.ascx.cs 中,而它应该在您的 aspx.cs 上。在 ascx.cs 上,您不能像这样引用它在 Parent 上的控件。

将此代码放入您的 aspx.cs 文件:

protected void validateCheckBoxes_ServerValidate(object source, ServerValidateEventArgs args)
{
        if (!EmailCourse.Checked && !SpecialReport.Checked)
            args.IsValid = false;
        else
            args.IsValid = true;

}

编辑:

您在 ascx 上的自定义验证器应如下所示:

<asp:CustomValidator id="CustomValidator1" runat="server" ErrorMessage="No checkbox  checked" ControlToValidate="EmailCourse" OnServerValidate="validateCheckBoxes_ServerValidate"/>

没有这个ControlToValidate属性服务器不知道你想验证哪个控件。

编辑2:

您是否尝试使用更改<input type="checkbox"/><asp:CheckBox />?并告诉我在 btn 单击或选中/取消选中复选框后应该如何验证?

编辑3:

检查您的 .ascx.designer.cs EmailCourse 是否有正确的类型。

编辑4:

当你有<asp:CheckBox .../>你的*.ascx文件时,你应该有你的ascx.designer.cs 这种类型protected global::System.Web.UI.WebControls.CheckBox EmailCourse

如果这有帮助,请告诉我。

于 2012-06-18T09:50:54.800 回答
1

Qs your question seems to be answered, I want to show you how you can write less

protected void validateCheckBoxes_ServerValidate(object source, ServerValidateEventArgs args)
{
args.IsValid = (!EmailCourse.Checked && !SpecialReport.Checked);
}

This is the same than what you wrote except this is in one line

于 2012-06-18T10:54:45.823 回答
0

好的。所以这是有效的:

正如 harry180 建议的那样,我确实需要将 input-type="CheckBox" 切换为 asp:CheckBox。

这触发了一个运行时错误,我在上面对此进行了评论。运行时错误是因为我在进行更改后没有重新编译解决方案,以便修改 ascs.designer.cs 文件。

重新编译后,代码工作。

于 2012-06-18T15:02:53.760 回答
0

我已经做了一个你尝试做的工作示例@user1463201

这是.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ValidationExample._Default" %>

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

   <html xmlns="http://www.w3.org/1999/xhtml">
   <head runat="server">
   <title></title>
   </head>
   <body>
      <form id="form1" runat="server">
        <div>
          <asp:ValidationSummary runat="server" ID="myValidationSummary" ValidationGroup="validation"/>
           <table>
             <tr>
                <td>
                  <asp:CheckBox runat="server" ID="cbxEmailCourse" Text="Email course" EnableViewState="True" AutoPostBack="True"/>
              </td>
            </tr>
            <tr>
              <td>
                <asp:CheckBox runat="server" ID="cbxSpecialReport" Text="Special report"/>
              </td>
           </tr>
           <tr>
              <td>
                <asp:TextBox Visible="False" Text="t" runat="server" ID="txtValid" ValidationGroup="validation"></asp:TextBox>
              </td>
              <td>
                <asp:Button runat="server" ID="btnValid" Text="Validate form" ValidationGroup="validation" OnClick="btnValid_Click"/>
                <asp:CustomValidator runat="server" ID="cValidator" ControlToValidate="txtValid" ValidationGroup="validation" OnServerValidate="cValidator_Validate"></asp:CustomValidator>
              </td>
          </tr>
      </table>
   </div>
  </form>
  </body>
 </html>

和 aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ValidationExample
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void cValidator_Validate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = cbxEmailCourse.Checked && cbxSpecialReport.Checked;
        }

        protected void btnValid_Click(object sender, EventArgs e)
        {
            if (!Page.IsValid)
               Response.Write("Page are not Validate");
        }

    }
 }

我希望我的工作能帮助别人:) 享受

于 2012-06-18T21:57:01.040 回答