2012-08-24 46 views
30

Tengo un pequeño problema con el uso de ValidationSummary(true) para mostrar los errores a nivel de modelo. Si el ModelState no contiene errores de modelo (es decir, ModelState.AddModelError("", "Error Description")) pero contiene errores de propiedad (agregados mediante anotaciones de datos), muestra el resumen de validación sin información de error (cuando ve la fuente). Por consiguiente, mi css está mostrando una caja vacía de color rojo, así:¿Por qué ValidationSummary (true) muestra un resumen vacío de los errores de propiedad?

enter image description here

Si no hay errores de propiedad no se muestra ninguna resumen de validación. Con ValidationSummary(true) esperaría que solo muestre errores de validación si hay errores de modelo. ¿Qué he entendido mal?

que tienen un proyecto básico de la siguiente manera:

controlador:

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

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

Modelo:

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

Vista:

@model IndexViewModel 

@Html.ValidationSummary(true) 

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

también ser conscientes de esta http://stackoverflow.com/questions/2818219/asp-net-mvc-html-validationsummarytrue-does-not-display-model-errors~~V~~singular~~3rd – maulik13

Respuesta

24

Creo que hay algún problema con el método de ayuda ValidationSummary. Puede crear fácilmente un método de ayuda personalizado que ajuste el ValidationSummary incorporado.

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

Entonces, desde su punto de vista,

@Html.CustomValidationSummary(true) 
+3

Parece que esto es también un problema con la corriente MVC4 que tengo? Decidí ir con esta solución al final, que funciona bien. Gracias por tu ayuda. – Dangerous

2

sé que una solución se ha encontrado, pero tuve un problema similar con una solución más fácil.

Está su validación prestación resumen con clase CSS "validación-summary-válidos" o "validación-summary- errores"? La primera clase se aplica con el resumen de validación está vacío, la segunda se aplica cuando se completa.

He notado que se genera un marcador de posición div si el resumen de validación no contiene errores, por lo que la validación del lado del cliente puede mostrarlo si alguno de los campos falla la validación.

En la hoja de estilos de MVC predeterminada 'Site.css' simplemente suprimen la visualización del resumen de validación vacío con 'display: none;' p. .validation-summary-valid {display: none; }

+1

Esto no es correcto. Si hay algún error (ya sea a nivel de modelo o de propiedad) siempre se aplica la clase 'validation-summary-errors'. El 'validation-summary-valid' solo se aplica cuando NO hay errores. Así que si usted está usando un 'Html.ValidationSummary (verdadero)' 'y vacío con div' se añade clase' validación-summary-errors', incluso cuando sólo hay errores de nivel de propiedad y sin errores a nivel de modelo. (Tenemos la misma situación con un formulario de acceso, donde utilizamos * * mensajes de error, ya sea a nivel de modelo o de nivel de propiedad, no ambos. – Chris

5

Otra forma de hacerlo es comprobar si hay algún elemento li, si no sólo ocultar validación-summary-errores

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

corto, sencillo y rápido al punto 1 –

15

Comprobar this pregunta también.

Se podría ocultar el resumen con CSS:

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

También, se puede poner el resumen de validación antes de la Html.BeginForm().

+0

trabajó para mí ... Gracias :) –

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

Esto comprueba si hay errores de todo el modelo y solo muestra el resumen cuando hay algunos.

+1

creo que un ayudante a medida (como en la respuesta aceptar) pero utilizando esta comprobación condición sería mejor - por ahora sólo he utilizado esta línea. Para ahorrar un poco de escribir sólo se puede utilizar lo siguiente: @if (ViewData.ModelState.Any (_ => _.Key == String.Empty)) {...}. Yo siempre prefiero usar String.Empty lugar de "" ya que muestra la intención explícita debido al esfuerzo extra en escribiéndola, mientras que "" podría ser simplemente que alguien había rastreado lado y se olvidó de volver y rellenarlo. – Peter

+5

En lugar de enumerar las teclas con 'Any', puede usar directamente' ContainsKey': 'if (ViewContext.ViewData.ModelState.ContainsKey (string.Empty))' –

1

Otra variante de la solución con las clases de rutina de carga es:

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

Es la scripts de validación haciendo esto.

cambiar los siguientes web.config

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

Debe ser falsa

+0

¿Esto no desactivará las secuencias de comandos de validación del lado del cliente para todo el sitio web? ¿Qué pasa si quiero usar los scripts de validación del lado del cliente? – Dangerous

+0

Este es PRECISAMENTE cuál es el problema. Html.ValidationSummary está representando los mensajes de error ... están presentes en la secuencia de respuesta HTTP, pero no en el HTML final de la página. Un SCRIPT del lado del cliente los está eliminando, y esto es de hecho. Qué configuración tan jodida. – Triynko

0

que estaba teniendo este problema Resumen de validación vacía. Acabo de establecer excludePropertyErrors en falso, y agregó los errores al resumen de validación.

Sé que esto no es necesariamente lo que se pide aquí - aunque esto no resuelve el problema de validación Resumen vacío - y es una opción si usted está teniendo este problema.

0

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

{

// Su contenido

}

¿Quieres trabajar como encanto.

Cuestiones relacionadas