3

私はこれをascxファイルに持っています:

<asp:textbox ID="AddHourlyRate" runat="server" width="55px" />
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
    ErrorMessage="Please enter a valid charge rate (whole number only)" 
    ValidationExpression="^\$?[0-9]+(\.[0]{2})?$" ControlToValidate="AddHourlyRate" 
    Display="Dynamic" runat="server" />

正規表現をコピーして貼り付けることなくValidationExpression、他の でを再利用するにはどうすればよいですか? asp:RegularExpressionValidator私はasp.NETが初めてです。

4

5 に答える 5

6

正規表現ごとにconst文字列を使用してクラスを作成します。正確な問題には、そのソリューションを使用します。そのクラスは、多数のプロジェクト間で共有される共通のアセンブリに含まれています。また、バリデーターコントロールだけでなく、他の場所でも正規表現を使用している可能性があります。

このようなもの :

public class RegularExpressions
{
  public const string TelephoneValidation = @"^[0-9 ]+$";
  public const string IntegerValidation = @"^\d+$";
}

次に、コードビハインドからバリデーター式を設定できます。

validator.ValidationExpression = RegularExpressions.IntegerValidation;

またはマークアップ:

<%@ Import Namespace="RegularExpression.Class.Namespace" %>  
.
.
.  
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
        ErrorMessage="Please enter a valid charge rate (whole number only)" 
        ValidationExpression="<%# RegularExpressions.IntegerValidation %>" ControlToValidate="AddHourlyRate" 
        Display="Dynamic" runat="server" />

もちろん、インポートディレクティブに適切な名前空間を記述します。

于 2012-05-15T22:44:35.313 に答える
2

正規表現を再利用できます (定数に抽出し、必要なすべての正規表現バリデーターの Page_Load 関数に設定します)。

public const string WholeNumbersValidation = @"^\$?[0-9]+(\.[0]{2})?$";

protected void Page_Load(object sender, EventArgs e)
{
   AddHourlyRateRegexValidator.ValidationExpression = WholeNumbersValidation;
   AddHourlyRateRegexValidator.ErrorMessage= "Please enter a valid charge rate (whole number only)";
   validatorIdForNextField.ValidationExpression = WholeNumbersValidation;
   validatorIdForNextField.ErrorMessage= "Error message text 2";

}

しかし、 ControlToValidateプロパティで複数の ID を受け入れないため、いくつかのフィールドに対して 1 つの正規表現 ASP.NET バリデーターを再利用することはできませんでした。

この問題を解決するには、送信時にテキストボックスを一度に検証する独自のクライアント側検証関数を作成して、サーバー側の検証関数も作成する必要があります。

于 2012-05-15T22:37:47.833 に答える
1

あなたは確かに次のようなことをすることができます:

private RegularExpressionValidator GetValidatorControl(string controlToValidate, string errorMessage)
{

    RegularExpressionValidator validator = new RegularExpressionValidator();
    validator.ID = String.Format("{0}RegExValidator", controlToValidate);
    validator.ValidationExpression = @"^\$?[0-9]+(\.[0]{2})?$";
    validator.ControlToValidate = controlToValidate;
    validator.ErrorMessage = errorMessage;
    return validator;

}

また、Page_Loadイベントなどでは、次のように呼び出すことができます。

Page.Controls.AddAt(Page.Controls.IndexOf(AddHourlyRate) + 1, GetValidatorControl(control.ID, "my validation message"));

これにより、バリデーターコントロールがページに追加され、式はここでのみ定義されます(静的メソッドとして別のクラスに配置し、プロジェクト全体で共有できます)。

このStackOverflow回答のメソッドを使用して、ページ上のすべてのRegExバリデーターを取得し、それぞれにValidationExpressionを設定することもできます。たとえば、すべてのコントロールをPanel(私の例ではRootPanelのID)または同様のコンテナコントロールでラップする場合、次のようになります。

IEnumerable<Control> validators = RootPanel.FlattenChildren();

IEnumerator<Control> enumerator = validators.GetEnumerator();

while (enumerator.MoveNext() == true)
{
    if (enumerator.Current is RegularExpressionValidator) //Only interested in RegularExpressionValidators. You could even filter this further by naming them consistently and checking for a fragment of the ID here.
    {
        ((RegularExpressionValidator)enumerator.Current).ValidationExpression = @"^\$?[0-9]+(\.[0]{2})?$"; //Load from config if necessary!
    }
}

FlattenChildrenメソッドを使用するには、プロジェクト内のどこかにあるパブリック静的クラスに配置し、適切なusingディレクティブを使用して参照します。.Netの拡張メソッドについては、この記事を参照してください。

何が起こっても、コントロールごとに1つのRegularExpressionValidatorが必要です。もちろん、他のオプションは、javascriptまたはPostBackでこれらを手動で検証することです。

于 2012-05-15T22:41:40.387 に答える
1

複数のバリデーターを使用する必要がありますが、式を値として web.config ファイルに保存し、インライン C# 経由でアクセスできるはずです。

web.config:

<appSettings>
  <add key="myRegExString" value="^\$?[0-9]+(\.[0]{2})?$" />
</appSettings>

YourPage.aspx で:

<asp:textbox ID="AddHourlyRate" runat="server" width="55px" />
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
    ErrorMessage="Please enter a valid charge rate (whole number only)" 
    ValidationExpression="<% = ConfigurationSettings.AppSettings["myRegExString"]%>" ControlToValidate="AddHourlyRate" 
    Display="Dynamic" runat="server" />
于 2012-05-15T22:43:29.587 に答える
1

プロジェクト レベルの設定として式を追加し、コード ビハインドで「ValidationExpression」を設定することを検討しましたか?

于 2012-05-15T22:37:53.150 に答える