ASP.NET MVC ValidationSummary con excludePropertyErrors = true rende vuoto se il modello è valido
-
27-09-2019 - |
Domanda
Diciamo che avete un ValidationSummary di serie:
<%: Html.ValidationSummary(excludePropertyErrors: true) %>
Se il ModelState contiene errori modello per le proprietà, ma non per il modello stesso della ValidationSummary rende il seguente codice HTML:
<div class="validation-summary-errors"><ul><li style="display:none"></li></ul></div>
che viene visualizzato come una lista vuota, ma è ancora visibile a causa del bordo rosso intorno alla lista. Questo sembra essere un bug per me. Posso disattivare che l'assistente ValidationSummary potrà mai rendere un elenco vuoto?
Soluzione
Simile alla risposta di usr, ho risolto questo con il seguente:
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;
}
In questo modo non ho sborsare in realtà l'originale.
D'accordo, però, questo è molto fastidioso.
Altri suggerimenti
Dopo ho scoperto che non esiste una soluzione, cercando la fonte ho risolto il problema si biforcano la versione MVC del codice e la modifica di una riga.
Un'altra variazione della correzione con le classi bootstrap è:
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;
}
}
Un'altra soluzione è quella di spostare lo stile al div. Ecco il CSS:
div.validation-summary-valid {
display: none;
}
Quando i rendimenti di sintesi senza errori non viene visualizzato il div. Quando ci sono errori della classe passa automaticamente a validazione-sintesi-errori.