3

2 つのテキスト ボックスが一度に検証に失敗すると、ValidationSummary は同じメッセージを 2 回表示します。

私は何か間違ったことをしていますか?または、重複メッセージを非表示にするために変更できる設定はありますか?

 

私はそれを最も単純な例に分解しました:

意見:

@model MyModel
@Html.ValidationSummary()
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)

モデル:

public class MyModel : IValidatableObject
{
    public int A { get; set; }
    public int B { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        //Some logic goes here.        
        yield return new ValidationResult("Validation failed", new[] { "A", "B" });
    }
}

結果:

ここに画像の説明を入力

4

3 に答える 3

9

ValidationSummary の観点からは重複していません。フィールド A と B の両方にモデル状態エラーを割り当てているため、検証の概要に 2 つのエラーがあるはずです。それらが同じであることを「認識」していません。

簡単な解決策:

  • それらの 1 つだけにモデルを割り当てます
  • プロパティに割り当てられたエラーを概要から除外する - Html.ValidationSummary(true)

少し難しい解決策:

  • 独自の ValidationSummary ヘルパーを作成し、その中で標準の検証サマリー ロジックを呼び出し、結果を「個別の選択」方法でフィルター処理します (ここでは linq があなたの友達です)。

編集:

たとえば、次のようなもの:

public static class ValidationExtensions
{
    public static MvcHtmlString FilteredValidationSummary(this HtmlHelper html)
    {
        // do some filtering on html.ViewData.ModelState 
        return System.Web.Mvc.Html.ValidationExtensions.ValidationSummary(html);
    }
}
于 2011-10-14T11:42:18.343 に答える
2

これはあなたの見解です

<ul class="validation-summary-errors">
    @{
        string errorMessage = "", previousError = "";
        foreach (ModelState modelState in (ViewContext.ViewData.ModelState.Values)){

            foreach (ModelError modelError in modelState.Errors)
            {
                errorMessage = modelError.ErrorMessage;
                if (errorMessage != previousError)
                {
                    <li>@modelError.ErrorMessage</li>
                    previousError = modelError.ErrorMessage;
                }                            
            }    
        }
    }
</ul>

これは、2つの連続するエラーが同じ場合にのみ機能するため、これを改善できる可能性があります。順序が乱れると、機能しない可能性がありますが、これで開始できます。エラーメッセージの配列を作成し、実行するたびにエラーをチェックできると思いますが、このソリューションはほとんどの場合機能しているようです。

于 2012-04-24T04:16:47.287 に答える
1

ValidationSummaryメソッドは、プロパティ レベルおよびモデル レベルのエラーを返します。引数を指定しない場合は、すべての検証メッセージを列挙するだけです。

1) フィールド A と B に異なるメッセージを使用する

// logic here
yield return new ValidationResult("Validation failed for left field", new[] { "A" });
// logic here
yield return new ValidationResult("Validation failed for right field", new[] { "B" });

または、あなたの見解では

2) excludePropertyErrors 引数を true - に設定して ValidationSummary を呼び出しますValidationSummary(true)。そしてHtml.ValidationMessage[For]、それぞれのフィールドの近くに電話をかけます。

UPDT: ... そして 3 番目のケース:

モデルに共通メッセージを追加します (モデルレベル):

//logic here
yield return new ValidationResult("Validation failed");
yield return new ValidationResult("any text or empty string", new[] { "A", "B" });

ビューでプロパティ メッセージを除外しますが、フィールドに ValidationMessage を追加しないでください。

@model MyModel
@Html.ValidationSummary(true)
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)

したがって、単一のメッセージと両方の赤いボックスが表示されます。

于 2011-10-14T11:38:21.177 に答える