2012-09-06 34 views
5

enter image description hereMVC 3の検証:検証

私はMVC 3の検証を使用していますが失敗したコントロールに対応する私のラベルの赤をオンにしたいです。私のプロダクトマネージャーは、エラーが発生した各コントロールのラベルを赤にしたいと考えています。

「生徒名」のラベルは赤色に変わるはずです。 「メールアドレス」のラベルが赤色に変わります。

私はdivの中に各エラーMSGをラップし、JSファイル内の各div要素

<div id="divValStudentFirstName">@Html.ValidationMessageFor(m => m.studentFirstName)</div> 

の長さをチェックしてみました:

$(document).ready(function() { 

    if ($("#divValStudentFirstName").length > 1) { 
       ("#divStudentFirstName").css("color", "red"); 

    } 

をしかし、私は何の成功を持っていません。検証チェックは完全なリフレッシュなしで行われ、その結果、検証中にmy $(document).readyが起動されません。私は本当にjsの中の王じゃない

クライアント側の検証が

を有効に

public static IHtmlString ValidationLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText = null) { 
      var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
      var name = ExpressionHelper.GetExpressionText(expression); 
      string resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? name.Split('.').Last(); 
      if (String.IsNullOrEmpty(resolvedLabelText)) { 
       return MvcHtmlString.Empty; 
      } 

      var tag = new TagBuilder("label"); 
      tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name))); 
      tag.GenerateId(name); 
      tag.SetInnerText(resolvedLabelText); 
      ModelState modelState; 
      string fullName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
      if (html.ViewData.ModelState.TryGetValue(fullName, out modelState)) { 
       if (modelState.Errors.Count > 0) { 
        tag.Attributes.Add("style", "color:red"); 
       } 
      } 
      return new MvcHtmlString(tag.ToString()); 
     } 

EDITが、これは上でも(動作するようです:

+0

ビューのコードの一部を表示できますか?あなたはLabelFor ...ラベルを使用していますか、EditorForは入力をしていますか? –

+0

はいラファエル、その典型的な実装

@Html.LabelFor(m => m.studentFirstName)
私は、それぞれが使用することを期待して移入された場合、私はそれに条件として確認することができるように専用という名前のdiv内の各ValidationMessageForを置いフォーム –

+0

上のdivでグループ化された検証と

@Html.TextBoxFor(m => m.studentFirstName, new { style = @controlWidth })
labelforを保持するdivのCSSを変更する –

答えて

4

クライアント側の検証は無効単純な場合少なくとも)

$('form').submit(function() { 
     var form = $(this); 
     $('label').removeClass('field-validation-error'); 
     if (!form.valid()) { 
      $('.input-validation-error') 
       .each(function() { 
        $("label[for='" + $(this).attr("id") + "']").addClass('field-validation-error'); 
       }); 
     } 
    }); 
+0

クライアント側の検証が有効になっています。しかし、私の要求は、関連するコントロールのラベルを赤くすることです。検証メッセージが表示された後、JQueryでcss属性を追加したい(アップロードしたimgのように) –

+0

@Dave yes、私の発言は愚かでした。私はまだ何かを探しています;) –

+0

決して愚か。この問題は複雑です。私はどれほど難しいのか驚いています。私は本当に$()。ready()のエラーメッセージをチェックできると思っていました。しかし、検証はサーバーを起動することなくすべてのクライアント側で行われるため、リフレッシュは行われず、新しい$ ready()イベントは発生しません。 –

0

以下は、送信ボタンがクリックされたときにエラークラスを追加(または削除)することで、divタグに色付けするJQuery関数です。ラベルを簡単に変更してクラスにラベルを追加することができます。

$('form').submit(function() { 

    if ($(this).valid()) { 
     $(this).find('div.form-group').each(function() { 
      if ($(this).find('span.field-validation-error').length == 0) { 
       $(this).removeClass('error-colored'); 
      } 
     }); 
    } 
    else { 
     $(this).find('div.form-group').each(function() { 
      if ($(this).find('span.field-validation-error').length > 0) { 
       $(this).addClass('error-colored'); 
      } 
     }); 
    } 
}); 
+0

このソリューションは、以下のチュートリアルのMVC検証にブートストラップエラーの強調表示を追加することに基づいています。また、サーバー側の検証エラーも解決します。 http://www.braindonor.net/blog/integrating-bootstrap-error-styling-with-mvcs-unobtrusive-error-validation/381/ –