2012-08-24 5 views
30

ValidationSummary(true)を使用してモデルレベルのエラーを表示する際に、少し問題があります。 ModelStateにモデルエラー(ModelState.AddModelError("", "Error Description"))が含まれていないのにプロパティエラー(データ注釈を使用して追加されたもの)が含まれている場合、エラー情報なしで(ソースを表示すると)検証サマリーが表示されます。その後、何の検証の概要が表示されていない全く性質のエラーがなければなぜValidationSummary(true)にプロパティエラーの空のサマリーが表示されますか?

enter image description here

:私の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; } 
} 

ビュー:

を0
@model IndexViewModel 

@Html.ValidationSummary(true) 

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

また、このことに注意してください。http://stackoverflow.com/questions/2818219/asp-net-mvc-html-validationsummarytrue-does-not-display-model-errors – maulik13

答えて

24

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) 
+3

これは現在の問題私が持っているMVC4?私はうまく動作する最後にこの解決策をとることにしました。ご協力いただきありがとうございます。 – Dangerous

2

私は回避策が発見されている知っているが、私は簡単に解決策と同様の問題がありました。

は、CSSクラス「検証サマリー-有効」または「検証サマリー・エラー」でレンダリングあなたの検証の概要ですか?最初のクラスが適用され、検証サマリーは空で、2番目のクラスは移入時に適用されます。

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

デフォルトのMVCスタイルシート 'Site.css'では、 'display:none;'で空の検証サマリを表示しないようにするだけです。例: .validation-summary-valid {表示:なし; }

+1

これは正しくありません。エラーがあれば(モデルレベルであれ、プロパティレベルであれ)、 'validation-summary-errors'クラスが常に適用されます。 'validation-summary-valid'は、エラーがない場合にのみ適用されます。したがって、プロパティレベルのエラーだけでモデルレベルのエラーがない場合でも、 'Html.ValidationSummary(true)'を使用し、クラス 'validation-summary-errors'で空の' div'が追加されているとします。 (私たちは、ログインフォームと同じ状況にあります。モデルレベルまたはプロパティレベルのエラーメッセージの両方を使用するのではなく、どちらかを使用します) – Chris

5

それはどんなのli要素がある場合だけ

<script type="text/javascript"> 
    $(document).ready(function() { 
      if ($(".validation-summary-errors li:visible").length === 0) { 
       $(".validation-summary-errors").hide(); 
      } 
    }); 
</script> 
+0

短くてシンプルで素早くポイント+1 –

15

チェックthis質問あまりにも検証サマリー・エラーを非表示にしていない場合は、チェックすることであることのもう一つの方法。

あなたはCSSで要約を隠すことができます:

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

また、あなたはHtml.BeginForm()前に、検証の概要を置くことができます。

+0

は私のために働いています... :) –

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

これは、モデルのワイドエラーがあるかどうかをチェックし、いくつかのものがある場合にのみそのサマリーをレンダリングします。ブートストラップクラスと

+1

私はカスタムヘルパー(受け入れる答えのように)が、この状態のチェックを使用して良いと思う - 今のところ私はこのインラインを使用しています。ちょっとだけタイピングを保存するには、次のようにします:@if(ViewData.ModelState.Any(_ => _.Key == string.Empty)){...}。私はいつもstring.Emptyを ""の代わりに使用するほうが好きですが、入力する際の余計な努力のために明示的な意図を示しているのに対し、 ""誰かが側に追いついて帰ってきて忘れてしまっているかもしれません。 – Peter

+5

'ContainsKey'を直接使用することができます:' if(ViewContext.ViewData.ModelState.ContainsKey(string.Empty)) ' –

1

修正の別の変形は次のとおりです。

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; 
    } 
} 
-1

それはこれをやって検証スクリプトです。

を変更し、次のweb.config

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

それは私がこの空の検証の概要問題を抱えていた

+0

これはウェブサイト全体のクライアント側の検証スクリプトを無効にしませんか?クライアント側の検証スクリプトを使用する場合はどうすればよいですか? – Dangerous

+0

これは問題の原因となります。 Html。ValidationSummaryは実際にエラーメッセージをレンダリングしています... HTTPレスポンスストリームには存在しますが、ページの最終HTMLにはありません。クライアント側のSCRIPTはそれらを削除していますが、これは本当にそれです。どのような構成を台無しにした。 – Triynko

0

でなければなりません。 excludePropertyErrorsをfalseに設定するだけで、エラーが検証サマリに追加されました。

これは必ずしもここで尋ねられるものではないことを認識しています。これは空の検証要約の問題を解決しますが、この問題が発生している場合はオプションです。

0

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

{

//あなたのコンテンツ

}

は魅力のように働くだろう。

関連する問題