ASP.NET MVC Html.ValidationSummary (true) non visualizza errori del modello


194

Ho qualche problema con Html.ValidationSummary. Non voglio visualizzare errori di proprietà in ValidationSummary. E quando imposto Html.ValidationSummary (true) non vengono visualizzati messaggi di errore da ModelState. Quando c'è qualche eccezione nell'azione del controller sulla stringa

MembersManager.RegisterMember(member);

la sezione catch aggiunge un errore a ModelState:

ModelState.AddModelError("error", ex.Message);

Ma ValidationSummary non visualizza questo messaggio di errore. Quando imposto Html.ValidationSummary (false) vengono visualizzati tutti i messaggi, ma non voglio visualizzare errori di proprietà. Come posso risolvere questo problema?

Ecco il codice che sto usando:

Modello:

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

controller:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

Visualizza:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

Risposte:


324

Credo che il modo in cui funziona il flag ValidationSummary sia che mostrerà ModelErrors string.emptycome chiave. Altrimenti si presume che sia un errore di proprietà. L'errore personalizzato che stai aggiungendo ha la chiave "errore", quindi non verrà visualizzato quando chiami ValidationSummary (true). Devi aggiungere il tuo messaggio di errore personalizzato con una chiave vuota come questa:

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover: Immagino che questo funzioni "come progettato" e non un bug: il sovraccarico di ValidationSummary () utilizzato per impostazione predefinita esclude gli errori ModelState associati alle proprietà del modello stesso. Ciò lascia che tali errori vengano rappresentati dalle chiamate Html.ValidationMessageFor () per ogni singola proprietà senza che siano duplicate nel riepilogo. Ciò premesso, sembra che qualsiasi errore del modello aggiunto con una chiave non vuota sia considerato associato a una proprietà del modello, anche se la chiave non corrisponde al nome di una proprietà.
Daniel Schaffer,

26
Solo una nota per altri implementatori: ModelState.AddModelError(string.Empty, ex);non sembra funzionare neanche. È necessario utilizzare il ModelState.AddModelError(string, string)sovraccarico come mostrato sopra.
Wolfyuk,

2
aggiornamento: in MVC4 questo non sembra più essere il caso. ModelState.AddModelError ("", ex.Message); funziona
Neil Thompson,

4
MVC5 Avevo ancora bisogno di chiamare il messaggio ex.per farlo funzionare.
smiggleworth,

salvato il giorno! MVC5 ha ancora alcuni problemi :)
juFo

67

Funziona meglio, poiché puoi mostrare validationMessage per una chiave specificata:

    ModelState.AddModelError("keyName","Message");

e visualizzalo in questo modo:

    @Html.ValidationMessage("keyName")

28

So che questo è un po 'vecchio ed è stato contrassegnato come risposta con 147 voti in più, ma c'è qualcos'altro da considerare.

Puoi avere tutti gli errori del modello, la proprietà denominata e stringa. Chiavi vuote allo stesso modo, essere mostrati nel ValidationSummary se necessario. C'è un sovraccarico in ValidationSummary che lo farà.

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

inserisci qui la descrizione dell'immagine


5
Sì! Basta passare @Html.ValidationSummary(true, "", new { @class = "text-danger" })a@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem il

7

Forse così:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

E nel display aggiungere:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

O

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

L'uso di questa linea può essere utile


Aggiungi la riga sopra nel file cshtml.
sachind

2

Nel mio caso non funzionava a causa del ritorno.

Invece di usare:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

Ero solito:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

È un modello, quindi è ovvio che ModelState.AddModelError("keyName","Message"); deve funzionare con un modello.

Questa risposta mostra perché. Aggiunta della convalida con DataAnnotations


0

Se quasi tutto sembra giusto, un'altra cosa a cui prestare attenzione è assicurarsi che il riepilogo della convalida non venga esplicitamente nascosto tramite un override CSS in questo modo:

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

Ciò può anche causare la @Html.ValidationSummaryvisualizzazione nascosta, poiché il riepilogo viene reso dinamicamente con la validation-summary-validclasse.


0

Puoi provare,

<div asp-validation-summary="All" class="text-danger"></div>

nota: questo deve essere un <div>, se è un <span> non verrà visualizzato.
Stephen Angell,

-4

Aggiungilo nella parte più bassa della tua vista:

@section Scripts {@ Scripts.Render ("~ / bundles / jqueryval")}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.