web-dev-qa-db-ja.com

ポストバックで、検証サマリーにエラーメッセージを追加するにはどうすればよいですか?

2つの質問:

ユーザーが送信をクリックしたときのポストバックで、検証サマリーにエラーメッセージを追加するにはどうすればよいですか?

組み込みの.net検証コントロールを使用して特定のテキストボックスを強調表示することもできますか?

57
Blankman

CustomValidatorコントロールを動的に作成し、Page.Validatorsコレクションに直接追加します。

Dim err As New CustomValidator
err.ValidationGroup = "MyGroup"
err.IsValid = False
err.ErrorMessage = "The password is invalid"
Page.Validators.Add(err)

CustomValidatorをマークアップに追加するのとは異なり、このメソッドではサーバー側のビジネスロジックに基づいて任意の数の任意のエラーメッセージを追加できます。

ページに直接追加することもできますが、従うべきルールがいくつかあります。

  1. 検証グループのコントロールと同じ名前付けコンテナーにコントロールを追加する必要があります。
  2. 検証メッセージをページ内のランダムな位置に表示したくない場合は、特定のコンテナーにバリデーターを追加するか、CSSクラスまたはスタイルを使用してそれを抑制する必要があります。

カスタムクラスとIValidatorの実装 を作成することもできます。これにより、1行のコードでメッセージを追加できますが、このメソッドは検証グループをサポートしません。

Anders Fjeldstadの提案に従って、ここに便利な拡張メソッドのセットがあります。

Imports Microsoft.VisualBasic
Imports System.Runtime.CompilerServices

Public Module PageExtensions

    <Extension()> _
    Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String)
        p.AddValidationError(errorMessage, String.Empty)
    End Sub

    <Extension()> _
    Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String, ByVal validationGroup As String)
        Dim err As New CustomValidator
        err.ValidationGroup = validationGroup
        err.ErrorMessage = errorMessage
        err.IsValid = False
        p.Validators.Add(err)
    End Sub

End Module
87
NightOwl888

カスタムバリデータを追加し、IsValidおよびErrorMessageプロパティを手動で設定します。このような並べ替え:

<asp:panel ID="ErrorsPanel" runat="server" CssClass="ErrorSummary">
    <asp:CustomValidator id="CustomValidator1" runat="server" 
        Display="None" EnableClientScript="False"></asp:CustomValidator>
    <asp:ValidationSummary id="ErrorSummary" runat="server" 
        HeaderText="Errors occurred:"></asp:ValidationSummary>
</asp:panel>

コードビハインドでは:

//
// Update the database with the changes
//
string ErrorDetails;
if (!Db.Update(out ErrorDetails))
{
    CustomValidator1.IsValid = false;
    CustomValidator1.ErrorMessage = ErrorDetails;
}
48
user53794

NightOwl888の優れたアイデアを少し拡張したものを次に示します。

public class ValidationError : CustomValidator
{
    public ValidationError(string group, string msg)
        : base()
    {
        base.ValidationGroup = group;
        base.ErrorMessage = msg;
        base.IsValid = false;
    }
}

public static class PageExtensions
{
    public static void ErrorMessage(this Page page, string group, string msg)
    {
        page.Validators.Add(new ValidationError(group, msg));
    }
}

エラーメッセージを発行したいときはいつでも、単にPage.ErrorMessage;メカニズムは彼が提案したものと同じです。

6
atlaste

必要なのは、カスタムバリデーターを作成し、ページのバリデーターコレクションに追加することです(条件が発生した場合)。

CustomValidator cv = new CustomValidator();

if(condition)
{
cv.IsValid = false;
cv.ErrorMessage = "This Catalog Data already exists.";
cv.ValidationGroup = "InputList";
this.Page.Validators.Add(cv);
}

[〜#〜] note [〜#〜]ValidationGroupの指定を忘れないでください。そうでない場合、エラーメッセージはカスタムバリデータがページに追加されているにもかかわらず表示されます。そして、あなたがあなたの2番目の質問(強調表示テキストボックス)への答えを得たら、それを投稿してください!

4
Sayan

検証概要にエラーメッセージを追加するには、ValidationSummaryおよびその他の検証コントロールのEnableClientScriptプロパティを使用できます。 EnableClientScriptをすべてfalseに設定します:

<asp:ValidationSummary
HeaderText="You must enter a value in the following fields :"
DisplayMode="BulletList"
EnableClientScript="false"
runat="server"/>

コントロールを強調表示するために、現在のコントロールでは不可能です。

ただし、検証コントロールを関連するコントロールの近くに配置し、それらのTextプロパティを「*」に設定します。その後、検証が失敗すると、失敗したコントロールの近くに表示されます。

カスタムバリデータを使用して、失敗したコントロールを強調表示することができます。ただし、独自の実装を作成する必要があります。

3
Canavar