【问题标题】:Required field validator for multiple dropdown lists in an aspx pageaspx 页面中多个下拉列表的必填字段验证器
【发布时间】:2011-04-30 05:26:54
【问题描述】:

我有一个包含 18 个(是 18 个)下拉列表和 18 个文本框的 aspx 页面。需要选择每个下拉列表,并且需要填充每个文本框。在这 36 个控件上拖放所需的字段验证器并对其进行维护是一项痛苦的任务,而且似乎不是合乎逻辑的选择,因为我需要的只是让用户从下拉列表中选择一个值。

我是否可以遍历所有这些下拉控件和文本框控件,检查它们是否为空并相应地向用户显示警告?客户端验证解决方案或服务器端验证解决方案对我来说很好。

【问题讨论】:

    标签: asp.net validation requiredfieldvalidator


    【解决方案1】:

    使用 CustomValidator 并拥有一个客户端脚本功能,以确保每个文本框/下拉菜单都有一个值。

    【讨论】:

      【解决方案2】:

      一个建议是遍历页面上的所有controls,使用recursive functionRequiredFieldValidator 动态绑定到找到的控件。您可以调整我的代码以满足您的需求。

      此代码有一些缺点:

      1. 使用 control.ID 而不是关联的标签文本
      2. 将RequiredFieldValidator 添加到page.controls 将修改它的ControlCollection。这将破坏 foreach 方法。因此,我只能将 RequiredFieldValidator 添加到 Panel。


      .aspx

      <asp:Panel ID="pnlValidation" runat="server">
      </asp:Panel>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
      <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
      <br />
      <asp:DropDownList ID="DropDownList1" runat="server" />
      <asp:DropDownList ID="DropDownList2" runat="server" />
      <asp:DropDownList ID="DropDownList3" runat="server" />
      <br />
      <asp:Button ID="Button1" runat="server" Text="Button" />
      


      .cs

      protected void Page_Load(object sender, EventArgs e)
      {
          AddValidator(this);
      }
      
      private void AddValidator(Control ctrl)
      {
          if (ctrl is TextBox || ctrl is DropDownList)
          {
              RequiredFieldValidator rfv = new RequiredFieldValidator();
              rfv.ControlToValidate = ctrl.ID;
              rfv.Display = ValidatorDisplay.Dynamic;
              rfv.ErrorMessage = ctrl.ID + " is required<br />";
              pnlValidation.Controls.Add(rfv);
          }
      
          foreach (Control subctrl in ctrl.Controls)
              AddValidator(subctrl);
      }
      

      【讨论】:

      • 嗨,李,我明白除了 pnlValidation 之外的所有内容..是所有验证者都去的面板吗??????
      • 是的,验证结果会显示在pnlValidation中。
      【解决方案3】:

      如果您正在动态生成文本框和下拉列表,您可能还希望动态生成验证控件,但如果所有下拉列表和文本框都是静态的,您可以使用以下内容:

      使用 CustomValidator Web 控件,编写客户端 javascript 方法来检查下拉列表和文本框的所有属性,并使用该函数配置 Web 控件的 ClientValidationFunction 并设置 EnableClientScript=true。此外,b/c 并非所有用户都启用了 javascript,此外,为了确保这是最佳实践,始终还要创建服务器端验证函数并在提交操作上调用 Page.IsValid()。

      .aspx 示例代码

      <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" 
      
      Inherits="Default2" %>
      
      <!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>
          <script language="javascript" type="text/javascript">
              function ValidateMe(sender, args) {
                  var txt = document.getElementById("txt");
                  if (txt.value != "")
                      args.IsValid = true;
                  else
                      args.IsValid = false;
              }
          </script>
      </head>
      <body>
          <form id="form1" runat="server">
              <asp:TextBox id="txt" runat="server" />
              <asp:CustomValidator ClientValidationFunction="ValidateMe" ID="custval" 
                  runat="server" ErrorMessage="Fail" onservervalidate="custval_ServerValidate" />
              <asp:Button ID="btn" runat="server" Text="push" onclick="btn_Click1" />
          </form>
      </body>
      </html>
      

      c#代码隐藏示例代码

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using System.Globalization;
      using System.Threading;
      
      
      public partial class Default2 : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
      
              if (!IsPostBack)
              {
      
              }
      
      
          }
      
          protected void btn_Click1(object sender, EventArgs e)
          {
              if (Page.IsValid)
              {
                  btn.Text = "PASS";
              }
              else
              {
                  btn.Text = "FAIL";
              }
          }
          protected void custval_ServerValidate(object source, ServerValidateEventArgs args)
          {
              if (txt.Text != "")
                  custval.IsValid = true;
              else
                  custval.IsValid = false;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 2015-12-29
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        相关资源
        最近更新 更多