asp.net mvc 3 - validationmessage - ¿Por qué ValidationSummary(true) muestra un resumen vacío para los errores de propiedad?
validationmessagefor jquery (9)
Estoy teniendo un pequeño problema con el uso de ValidationSummary(true)
para mostrar errores de 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 se ve el origen). Por lo tanto, mi CSS muestra una caja roja vacía como esta:
Si no hay errores de propiedad, no se muestra ningún 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?
Tengo 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; }
}
Ver:
@model IndexViewModel
@Html.ValidationSummary(true)
@using(@Html.BeginForm())
{
@Html.TextBoxFor(m => m.Name)
<input type="submit" value="submit" />
}
@if (ViewContext.ViewData.ModelState.Count> 0)
{
//Tu contenido
}
Funcionaría como el encanto.
Compruebe this pregunta también.
Podrías esconder el resumen con CSS :
.validation-summary-valid { display:none; }
Además, podría colocar el resumen de validación antes de Html.BeginForm()
.
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)
Estaba teniendo este problema de resumen de validación vacío. Acabo de establecer excludePropertyErrors
en falso, y agregó los errores al resumen de validación.
@Html.ValidationSummary(false)
Me doy cuenta de que esto no es necesariamente lo que se solicita aquí, aunque resuelve el problema del resumen de validación vacío, y es una opción si tiene este problema.
Otra forma de hacerlo es verificar si hay elementos li, si no solo ocultar los errores de validación-resumen
<script type="text/javascript">
$(document).ready(function () {
if ($(".validation-summary-errors li:visible").length === 0) {
$(".validation-summary-errors").hide();
}
});
</script>
Otra variación de la corrección con las clases de Bootstrap 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;
}
}
Sé que se ha encontrado una solución, pero tuve un problema similar con una solución más fácil.
¿Su representación de resumen de validación con la clase css " validation-summary-valid " o " validation-summary-errors "? La primera clase se aplica con el resumen de validación está vacío, la segunda se aplica cuando se completa.
Me di cuenta de que se representa un marcador de posición 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;'' ej. .validation-summary-valid {display: none; }
Son los scripts de validación que hacen esto.
Cambie lo siguiente por web.config
<add key="ClientValidationEnabled" value="false" />
Debe ser falso
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any())
{
@Html.ValidationSummary(true, null, new { @class = "ui-state-error" })
}
Esto verifica si hay errores de todo el modelo y solo representa el resumen cuando hay alguno.