2010-10-03 15 views
10

Digamos que tienes una ValidationSummary estándar:ASP.NET MVC ValidationSummary con excludePropertyErrors = true hace que vacía si el modelo es válido

<%: Html.ValidationSummary(excludePropertyErrors: true) %> 

Si el ModelState contiene errores en el modelo de propiedades, pero no para el propio modelo del ValidationSummary hace el código HTML siguiente:

<div class="validation-summary-errors"><ul><li style="display:none"></li></ul></div> 

que se muestra como una lista vacía, pero todavía es visible debido a la frontera roja alrededor de la lista. Esto parece ser un error para mí. ¿Puedo desactivar que el ayudante de ValidationSummary alguna vez represente una lista vacía?

Respuesta

11

Similar a la respuesta de usr, me fijo esto con lo siguiente:

public static IHtmlString FixedValidationSummary(this HtmlHelper htmlHelper) 
{ 
    return htmlHelper.FixedValidationSummary(false); 
} 

public static IHtmlString FixedValidationSummary(this HtmlHelper htmlHelper, 
    bool excludePropertyErrors) 
{ 
    var result = htmlHelper.ValidationSummary(excludePropertyErrors); 
    return result == null || result.ToString().Contains("display:none") ? null : result; 
} 

De esta manera no tengo que desembolsar en realidad el original.

De acuerdo, sin embargo, esto es muy molesto.

2

Después de descubrir que no hay solución al mirar la fuente, resolví el problema bifurcando la versión MVC del código y modificando una línea.

+0

Mmmm .. que sux :( –

+0

Solo debe bifurcar 3 funciones. – usr

0

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

Otra solución es mover el estilo a la div. Aquí está el CSS:

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

Cuando el resumen vuelve sin errores, no se muestra el div. Cuando hay errores, la clase se cambia automáticamente a validation-summary-errors.

Cuestiones relacionadas