35

ValidationSummary(true)モデルレベルのエラーを表示するためのの使用にわずかな問題があります。ModelStateにモデルエラーが含まれていない場合(つまりModelState.AddModelError("", "Error Description"))、プロパティエラーが含まれている場合(データ注釈を使用して追加)、エラー情報なしで検証の概要が表示されます(ソースを表示した場合)。したがって、私のcssは次のように空の赤いボックスを表示しています。

ここに画像の説明を入力してください

プロパティエラーがない場合、検証の概要は表示されません。ValidationSummary(true)モデルエラーがある場合にのみ検証エラーが表示されると思います。私は何を誤解しましたか?

私は次のような基本的なプロジェクトを持っています:

コントローラ:

public class HomeController : Controller
{
    public ViewResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(IndexViewModel model)
    {
        return View();
    }
}

モデル:

public class IndexViewModel
{
    [Required]
    public string Name { get; set; }
}

意見:

@model IndexViewModel

@Html.ValidationSummary(true)

@using(@Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Name)
    <input type="submit" value="submit" />
}
4

11 に答える 11

35
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any())
{
    @Html.ValidationSummary(true, null, new { @class = "ui-state-error" })
}

これは、モデル全体のエラーがあるかどうかをチェックし、エラーがある場合にのみ要約をレンダリングします。

于 2013-09-29T00:26:06.217 に答える
27

ValidationSummaryヘルパーメソッドに何か問題があると思います。組み込みをラップするカスタムヘルパーメソッドを簡単に作成できますValidationSummary

public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors)
{
  var htmlString = htmlHelper.ValidationSummary(excludePropertyErrors);

  if (htmlString != null)
  {
    XElement xEl = XElement.Parse(htmlString.ToHtmlString());

    var lis = xEl.Element("ul").Elements("li");

    if (lis.Count() == 1 && lis.First().Value == "")
      return null;
  }

  return htmlString;
}

次に、あなたの視点から、

@Html.CustomValidationSummary(true)
于 2012-08-24T14:25:38.603 に答える
21

この質問もチェックしてください。

CSSで要約を隠すことができます:

.validation-summary-valid { display:none; }

また、検証の概要をの前に置くこともできますHtml.BeginForm()

于 2013-06-25T13:59:33.997 に答える
6

それを行う別の方法は、validation-summary-errorsを非表示にするだけでなく、li要素があるかどうかを確認することです。

<script type="text/javascript">
     $(document).ready(function () {
          if ($(".validation-summary-errors li:visible").length === 0) {
               $(".validation-summary-errors").hide();
          }
     });
</script>
于 2013-03-11T17:23:38.110 に答える
2

回避策が見つかったことは知っていますが、より簡単な解決策で同様の問題が発生しました。

検証サマリーは、cssクラス「validation-summary-valid」または「validation-summary-errors」でレンダリングされていますか?最初のクラスは検証サマリーが空の状態で適用され、2番目のクラスはデータが入力されたときに適用されます。

検証の概要にエラーが含まれていない場合はプレースホルダーdivがレンダリングされるため、検証に失敗したフィールドがある場合はクライアント側の検証で表示できます。

デフォルトのMVCスタイルシート「Site.css」では、「display:none;」を使用して空の検証サマリーの表示を抑制します。例:.validation-summary-valid {表示:なし; }

于 2013-02-12T17:48:31.787 に答える
1

Bootstrapクラスによる修正の別のバリエーションは次のとおりです。

public static class ValidationSummaryExtensions
{
    public static MvcHtmlString CleanValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message = null)
    {
        if(htmlHelper == null) throw new ArgumentNullException("htmlHelper");

        MvcHtmlString validationSummary = null;
        if (htmlHelper.ViewData.ModelState.ContainsKey(string.Empty))
        {
            var htmlAttributes = new { @class = "alert alert-danger" };
            validationSummary = htmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes);
        }

        return validationSummary;
    }
}
于 2014-03-04T12:13:46.647 に答える
1

私はこの空の検証要約の問題を抱えていました。excludePropertyErrorsfalseに設定しただけで、検証の概要にエラーが追加されました。

@Html.ValidationSummary(false)

これは必ずしもここで求められていることではないことを理解しています-これは空の検証要約の問題を解決しますが-そしてこの問題が発生している場合のオプションです。

于 2016-08-11T19:02:39.927 に答える
1

@if(ViewContext.ViewData.ModelState.Count> 0)

{{

//あなたのコンテンツ

}

魅力のように機能します。

于 2017-01-10T13:54:19.030 に答える
1

ValidationSummaryは、オプションのメッセージパラメータを受け入れます。このパラメータを設定すると、ボックスはばかげているようには見えません。

@Html.ValidationSummary(true, "Sorry, that didn't work. Please check the details submitted and try again.")

ここに画像の説明を入力してください

于 2019-04-04T15:40:36.187 に答える
0

このトピックは古いことは知っていますが、MVC 5でもこの動作は存在します。これは、ほとんどの人が期待する動作ではありません。「プロパティ以外の」ModelStateエラーが必要な場合は、次のようにします。

ModelState.AddModelError(string.Empty, ex.Message);

空のキーが存在する場合にのみ要約を表示したいので、このHtmlHelperはトリックを実行し、受け入れられた回答IMOよりもクリーンです。

public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper,
    bool excludePropertyErrors, string message = null)
{
    // Don't render summary if there are no empty keys when excluding property errors
    if (excludePropertyErrors && !htmlHelper.ViewData.ModelState.ContainsKey(string.Empty))
        return null;

    // Use default
    return htmlHelper.ValidationSummary(excludePropertyErrors, message);
}

プロパティエラーを除外する場合、クライアント側の検証に使用できるサマリーDIVは必要ない可能性が高いため、レンダリングしないで問題ありません。これがあなたの何人かを助けることを願っています。

于 2020-07-10T14:55:59.557 に答える
-1

これを行うのは検証スクリプトです。

次のweb.configを変更します

<add key="ClientValidationEnabled" value="false" />

それは間違っているはずです

于 2015-06-19T13:25:19.160 に答える