验证复选框在ASP.NET C#中的使用

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”的定义,并且没有扩展方法接受类型为“ASP.common_controls_specialreportform_ascx”的第一个参数(是否缺少使用指令或程序集引用?)
还有:
error CS1061:'ASP.common_controls_specialreportform_ascx'不包含“validateCheckBoxes_ServerValidate”的定义,并且没有扩展方法接受类型为“ASP.common_controls_specialreportform_ascx”的第一个参数(是否缺少使用指令或程序集引用?)
有人知道这个错误的原因吗?我是asp.net的新手,对此感到困惑。
谢谢!

1
你确定代码后台处理程序实际上在被 ASCX 页面引用的类中吗? - freefaller
@freefaller 是正确的,我也认为这是类引用或命名空间问题。 - yogi
harry180在他的回答中指出了一个好地方... user1463201,您能否确认复选框是否位于父ASPX页面上,并且代码位于ASCX页面后面(与您的问题相符),还是这是一个打字错误,复选框也位于ASCX页面上? - freefaller
4个回答

2
在*.ascx.cs文件中使用validateCheckBoxes_ServerValidate是不正确的,应该放在aspx.cs文件中。 在ascx.cs文件中,不能像这样引用它所在父控件。 将以下代码放到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:

当您在*.ascx文件上有<asp:CheckBox .../>时,您的ascx.designer.cs文件应该具有此类型protected global::System.Web.UI.WebControls.CheckBox EmailCourse

请让我知道这是否有所帮助。


谢谢您的帮助!实际上,我有一个打字错误,我已经在我的原始问题中进行了编辑。复选框位于.ascx页面上,而validateCheckBoxes_ServerValidate函数位于代码后台,在.ascx.cs页面上。您认为阻止此功能正常工作的问题是什么? - code2b
我尝试执行以下代码:<td colspan="3"> <asp:CheckBox id="EmailCourse" runat="server" Text="Email course -- Send me one tip a day."></asp:CheckBox> <asp:CustomValidator id="CustomValidator1" runat="server" ErrorMessage="No checkbox checked" ControlToValidate="EmailCourse" OnServerValidate="validateCheckBoxes_ServerValidate"></asp:CustomValidator> </td> 但是我遇到了一个 asp.net 运行时错误: “基类包含字段 EmailCourse... 但它的类型... 不兼容” 谢谢 Harry180 - 我很感激你的帮助! - code2b
我在.ascx.designer.cs文件中对EmailCourse的类型是:protected global::System.Web.UI.HtmlControls.HtmlInputCheckBox EmailCourse; 这看起来对我来说很好... - code2b
它有帮助吗?如果是,请将其标记为答案。 - Harry89pl

1

由于您的问题似乎已经得到了解答,我想向您展示如何写更少的代码。

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

这与您所写的相同,只是在一行中。


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");
        }

    }
 }

希望我的工作能帮助到某些人:) 享受


0

好的。所以这是有效的解决方案:

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

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

重新编译后,代码可以正常工作。


有人知道为什么页面验证复选框需要这么长时间吗?我以为可能是因为这不在客户端上,所以我也添加了客户端验证。但这并没有帮助它缩短时间。似乎它没有执行我添加的客户端验证。这可能吗?它首先执行服务器端验证吗?那就很奇怪了。还是我的客户端验证代码有问题?谢谢! - code2b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接