0

18 (はい 18) のドロップダウン リストと 18 のテキスト ボックスを持つ aspx ページがあります。各ドロップダウンを選択する必要があり、各テキストボックスに入力する必要があります。これらの 36 のコントロールに必要なフィールド バリデーターをドラッグ アンド ドロップして維持するのは骨の折れる作業であり、必要なのはユーザーがドロップダウンから値を選択することだけであるため、論理的なオプションではないようです。

とにかく、これらすべてのドロップダウン コントロールとテキスト ボックス コントロールをループして、それらが空かどうかを確認し、それに応じてユーザーに警告を表示することはできますか? クライアント側の検証ソリューションまたはサーバー側の検証ソリューションは、私にとっては問題ありません。

4

3 に答える 3

2

CustomValidatorを使用し、すべてのテキストボックス/ドロップダウンに値があることを確認するクライアントスクリプト関数を用意します。

于 2010-10-25T13:37:43.487 に答える
0

1つの提案は、ページ上のすべてのコントロールをループし、再帰関数を使用して、 RequiredFieldValidatorを見つかったコントロールに動的にバインドすることです。ニーズに合わせて私のコードを微調整できます。

ただし、このコードにはいくつかの欠点があります。

  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);
}
于 2010-10-25T14:32:59.900 に答える
0

テキストボックスとドロップダウンリストを動的に生成している場合は、おそらく検証コントロールも動的に生成したいでしょうが、すべてのドロップダウン リストとテキストボックスが静的である場合は、次を使用できます。

CustomValidator Web コントロールを使用し、ドロップダウン リストとテキスト ボックスのすべてのプロパティをチェックするクライアント側の JavaScript メソッドを記述し、関数を使用して Web コントロールの ClientValidationFunction を構成し、EnableClientScript=true を設定します。また、すべてのユーザーが 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;
    }
}
于 2010-10-25T15:07:43.067 に答える