2

私は最初の実際の ASP ページを作成しており、14 の異なるテキスト ボックス フィールドで時刻を検証する必要があります (値が存在することと、値が最終的に 0:00:00 ~ 23:59:59 の間であることの両方)。 )。14 個のカスタム バリデーターまたは 14 個の範囲 (または RegEx) バリデーターと 14 個の必須フィールド バリデーター。

バリデーターは何らかの理由で存在する必要があると思いますが、このコンテキストでバリデーターを使用して検証することは、使用しないよりもはるかに多くの作業を行うように見え、それを正当化する利点は見当たりません。

私が見ていない ASP.NET バリデーターの利点はありますか? ASP マークアップで同じバリデーターの 14 個のコピーを作成することは、良い解決策とは思えません。

4

5 に答える 5

3

熟考した結果、このシナリオに対する私の最良のアイデアは、とまたはWebUserControlを持つです。次に、ページにドラッグ アンド ドロップするだけです。を使用した簡単な例を次に示します。TextBoxCustomFieldValidatorRequiredFieldValidatorWebUserControlRequiredFieldValidator

ASCX ファイル (Web コントロール):

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SelfValidationTextBox.ascx.cs" Inherits="SelfValidationTextBox" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="* Required Field"></asp:RequiredFieldValidator>

ASPX ファイル:

<%@ Register Src="SelfValidationTextBox.ascx" TagName="SelfValidationTextBox" TagPrefix="uc1" %>
<!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">
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox1" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox2" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox3" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox4" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox5" runat="server" />
    <br />
    <br />
    <asp:Button ID="Button1" runat="server" Text="Click Me" />
    </form>
</body>
</html>

これは良い回避策だと思います.CustomFieldValidatorsとこのソリューションを使用する関数を1つだけ使用することを提案したようにすることもできます.

WebUserControl で RequiredFieldValidators を使用した結果

于 2012-12-26T23:11:49.903 に答える
0

私見ですが、私は主にASP.Netバリデーターを「サーバー側」の検証として扱います-まさにあなたが言うように-「送信後」/ポストバック。

特定のケースでは、14ボックス(必須+範囲)に同じルーチンが必要な場合、クライアント側の検証にASP.Netバリデーターを使用する利点を、のクライアント側のオプション(jQuery検証など)に「置き換える」ことができます。それを(再)取得し、サーバー側の検証を維持することができます(そして、14回の使用で1つのサーバー側のルーチンを実行できます-別名「カスタム検証」)。

クライアント側の検証の「利点」は(ASP.Netバリデーターまたは他のフレームワークを介して)、エントリがユーザーによって提供されているときに検証され(ポストバック/送信なし)、送信自体でも同じであるということです-サーバーはありませんクライアント側での検証が完了するまでの作業/ポストバック(サーバー上ですべてではなくクライアントに作業を渡すことになり、同じルーチンを実行する14のバリデーターを配線する必要はありません)。

于 2012-12-26T23:50:39.153 に答える
0

Repeater コントロールを使用して、各項目のデータを保持するオブジェクトのリストにバインドします。コードビハインドですべて簡単かつ迅速に行うことができ、検証はクライアント側とサーバー側の両方で機能します。つまり、ユーザーがjavascriptをオフにしても機能します。

以下のように、データ クラスを定義します。

  public class InputDataItem
  {
    public string Text { get; set; }

    public InputDataItem()
    {
    }

    public InputDataItem(string text)
    {
      this.Text = text;
    }
  }

およびマークアップ:

<asp:Repeater ID="rptInputs" runat="server">
  <ItemTemplate>
    <asp:TextBox ID="tbxInput" runat="server" Text='<%# Eval("Text") %>'></asp:TextBox>
    <asp:RequiredFieldValidator ID="rqfValidator" runat="server" ControlToValidate="tbxInput" ErrorMessage="* Required!"></asp:RequiredFieldValidator>
  </ItemTemplate>
</asp:Repeater>
<br />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />

リピーターをバインドし、このコードでユーザーが入力した値を取得します

protected void Page_Init(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    var data = new List<InputDataItem>();
    for (int i = 0; i < 5; i++)
    {
      data.Add(new InputDataItem("Item " + i.ToString()));
    }
    rptInputs.DataSource = data;
    rptInputs.DataBind();
  }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
  if (IsValid)
  {
    var data = new List<InputDataItem>();
    foreach (RepeaterItem rit in rptInputs.Items)
    {
      Control cnt = rit.FindControl("tbxInput");
      if (cnt != null && cnt is TextBox)
        data.Add(new InputDataItem((cnt as TextBox).Text));
    }
    /// here you have list of POCO objects filled with user input
  }
}
于 2012-12-27T00:33:35.607 に答える
0

可能であれば、ASP.NET バリデータを使用してください。

他の人があなたが何をしているのかを次の点で簡単に確認できます。

  • 適用される規則
  • ローカリゼーション
  • クライアント側のアプローチ

同じものを14回処理する必要がある場合、コードの繰り返しについても心配します。ただし、これは、テキスト ボックスのコードを記述した場合でも当てはまります。コントロール (テキストボックスとバリデーター) を分離コードから動的にページに配置します。これは ASP.NET の最も簡単な部分ではありませんが、長期的には役に立ちます。

ここであなたがそれを行う方法を見てください。 http://geekswithblogs.net/shahed/archive/2008/06/26/123391.aspx

于 2012-12-26T23:32:20.927 に答える
-1

すでに行われていることをなぜやりたいのですか?Asp.net バリデータは、クライアント側とサーバー側の両方の検証を提供します。DRY - 繰り返さないでください。ASP.net Validators を使用するだけです

于 2012-12-26T22:31:42.997 に答える