2012-08-24 5 views
30

Ho riscontrato un leggero problema con l'utilizzo di ValidationSummary(true) per visualizzare errori a livello di modello. Se ModelState non contiene errori di modello (ad esempio ModelState.AddModelError("", "Error Description")) ma contiene errori di proprietà (aggiunti utilizzando annotazioni di dati), visualizza il riepilogo di convalida senza alcuna informazione di errore (quando si visualizza l'origine). Il mio css è quindi visualizza un box rosso vuoto in questo modo:Perché ValidationSummary (true) mostra un riepilogo vuoto per errori di proprietà?

enter image description here

Se non ci sono errori di proprietà, allora viene visualizzato nessun sintesi di convalida. Con ValidationSummary(true) mi aspetterei che visualizzi solo errori di validazione se ci sono errori di modello. Che cosa ho frainteso?

Ho un progetto di base come segue:

Controller:

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

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

Modello:

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

Anche essere a conoscenza di questo http://stackoverflow.com/questions/2818219/asp-net-mvc-html-validationsummarytrue-does-not-display-model-errors – maulik13

risposta

24

Penso che ci sia qualcosa di sbagliato con il metodo di supporto ValidationSummary. È possibile creare facilmente un metodo di supporto personalizzato che comprenda l'ValidationSummary integrato.

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

Poi dalla visualizzazione,

@Html.CustomValidationSummary(true) 
+3

Sembra che questo sia anche un problema con l'attuale MVC4 che ho? Ho deciso di andare con questa soluzione, alla fine, che funziona bene. Grazie per l'aiuto. – Dangerous

2

So che una soluzione è stata trovata, ma ho avuto un problema simile con una soluzione più facile.

È il vostro convalida il rendering riassunto con classe CSS "validazione-sintesi-validi" o "convalida-sintesi-errori"? La prima classe viene applicata con il riepilogo di convalida è vuoto, il secondo viene applicato quando è popolato.

Ho notato che il rendering di un segnaposto viene eseguito se il riepilogo di convalida non contiene errori, in modo che la convalida del lato client possa visualizzarlo se alcuni campi falliscono la convalida.

Nel foglio di stile MVC predefinito "Site.css" semplicemente sopprimono la visualizzazione del riepilogo di convalida vuoto con "display: none;" ad es. .validation-summary-valid {display: none; }

+1

Questo non è corretto. Se ci sono errori (sia a livello di modello che a livello di proprietà) viene sempre applicata la classe 'validation-summary-errors'. Il 'validation-summary-valid' è applicato solo quando non ci sono errori. Quindi, se si sta usando un 'Html.ValidationSummary (true)' e si svuota 'div' con la classe' validation-summary-errors', anche quando ci sono solo errori a livello di proprietà e nessun errore a livello di modello. (Abbiamo la stessa situazione con un modulo di login, dove usiamo * o * messaggi di errore a livello di modello o di proprietà, non entrambi. – Chris

5

Un altro modo di farlo è quello di verificare se ci sono elementi li, se non solo nascondere validazione-sintesi-errors

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

breve, semplice e veloce al punto +1 –

15

check this domanda troppo.

Si potrebbe nascondere il sommario con CSS:

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

Inoltre, si potrebbe mettere il riepilogo di convalida prima della Html.BeginForm().

+0

ha funzionato per me ... grazie :) –

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

Controlla se ci sono errori del modello e restituisce il riepilogo solo quando ce ne sono alcuni.

+1

Penso che un aiuto personalizzato (come nella risposta di accettazione), ma usando questo controllo delle condizioni sarebbe meglio - per ora ho appena usato questo in linea. Per salvare un po 'di digitazione puoi semplicemente usare il seguente: @if (ViewData.ModelState.Any (_ => _.Key == string.Empty)) {...}. Preferisco sempre usare string.Empty invece di "" poiché mostra intenzioni esplicite a causa dello sforzo extra di digitarla, mentre "" potrebbe essere solo qualcuno che viene monitorato e dimenticato di tornare e riempirlo. – Peter

+5

Piuttosto che enumerare le chiavi con 'Any', puoi usare direttamente' ContainsKey': 'if (ViewContext.ViewData.ModelState.ContainsKey (string.Empty))' –

1

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

E 'gli script di convalida facendo questo.

Modificare le seguenti web.config

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

Dovrebbe essere falsa

+0

Questo non disabilita gli script di convalida lato client per l'intero sito web? Cosa succede se voglio utilizzare gli script di convalida lato client? – Dangerous

+0

Questo è PRECISAMENTE qual è il problema. Html.ValidationSummary sta effettivamente visualizzando i messaggi di errore ... sono presenti nel flusso di risposta HTTP, ma non nell'HTML finale della pagina. Uno SCRIPT sul lato client li sta eliminando, e questo è davvero. Che configurazione sbagliata. – Triynko

0

ho avuto questo problema sintesi convalida vuota. Ho appena impostato excludePropertyErrors su false e aggiunto gli errori al riepilogo di convalida.

Mi rendo conto che questo non è necessariamente quello che viene chiesto qui - anche se questo risolve il problema sommario di convalida vuoto - ed è un'opzione se si sta avendo questo problema.

0

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

{

// Il contenuto

}

avrebbe funzionato come fascino.

Problemi correlati