2012-09-06 5 views
5

enter image description hereMVC 3-Validierung: möchte meine Etiketten rot, die Kontrollen entsprechen, die Validierung fehlgeschlagen

Ich verwende MVC 3-Validierung. Mein Produktmanager möchte, dass das Etikett für jedes Steuerelement, bei dem ein Fehler aufgetreten ist, rot wird.

So sollte "Schüler Vorname" Etikett rot werden. Die E-Mail-Adresse sollte rot angezeigt werden.

Ich habe versucht, jeden Fehler msg in einem div zu wickeln und die Länge jedes div überprüfen

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

in einer js-Datei:

$(document).ready(function() { 

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

    } 

Aber ich habe keinen Erfolg. Die Validierungsprüfung wird ohne eine vollständige Aktualisierung durchgeführt, und daher wird mein $ (document) .ready nicht ausgelöst, wenn die Validierung eintritt.

+0

Können Sie einen Teil des Codes Ihrer Ansicht zeigen? Verwenden Sie LabelFor ... für Labels, EditorFor für Eingaben oder? –

+0

ja Raphael, es ist eine typische Implementierung

@Html.LabelFor(m => m.studentFirstName)
@Html.TextBoxFor(m => m.studentFirstName, new { style = @controlWidth })
mit in divs über das Formular gruppierte Validierung –

+0

ich jedes ValidationMessageFor in einem eigenen Namen div platziert, so dass ich, wenn jeder, dass als Voraussetzung dafür zu verwenden, die Hoffnung, bevölkert überprüfen konnte zu Ändern Sie die CSS des div mit der Bezeichnung für –

Antwort

4

Client-seitige Validierung deaktiviert:

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

Validierung Client-Seite

aktiviert

Ich bin wirklich kein König in js, aber dies scheint auf eine (gut zu funktionieren einfacher Fall mindestens)

+0

clientseitige Validierung ist aktiviert. Aber meine Anforderung ist, auch die Beschriftung der zugehörigen Kontrolle rot zu machen. Ich möchte ein css-Attribut mit JQuery hinzufügen, nachdem die Überprüfungsmeldung auftaucht (wie in img ich hochgeladen) –

+0

@Dave ja, meine Bemerkung war dumm. Ich bin immer noch auf der Suche nach etwas;) –

+0

nie dumm. dieser Problemkomplex. Ich bin überrascht, wie schwierig es ist. Ich dachte wirklich, ich könnte einfach den Fehler msg auf $(). Ready() überprüfen. Da die Validierung jedoch auf allen Client-Seiten erfolgt, ohne den Server zu treffen, erfolgt keine Aktualisierung und kein neues Ereignis $ ready(). –

0

Im Folgenden finden Sie eine JQuery-Funktion, mit der das enthaltene div-Tag durch Hinzufügen (oder Entfernen) einer Fehlerklasse beim Klicken auf die Schaltfläche zum Senden markiert wird. Es kann leicht geändert werden, um die Klasse dem Label hinzuzufügen.

$('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

Diese Lösung basiert auf dem folgenden Lernprogramm zum Hinzufügen von Bootstrap-Fehlerhervorhebung zur MVC-Validierung. Außerdem werden serverseitige Validierungsfehler behoben. http://www.braindonor.net/blog/integrating-bootstrap-error-styling-with-mvcs-unobtrusive-error-validation/381/ –

Verwandte Themen