2010-05-12 19 views
174

Ho qualche problema con Html.ValidationSummary. Non voglio visualizzare errori di proprietà in ValidationSummary. E quando imposto Html.ValidationSummary (true) non visualizza messaggi di errore da ModelState. Quando c'è qualche eccezione in azione di controllo sulla stringaASP.NET MVC Html.ValidationSummary (true) non visualizza gli errori del modello

MembersManager.RegisterMember(member); 

sezione cattura aggiunge un errore al ModelState:

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

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

Ecco il codice che sto utilizzando:

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

Vista:

<% 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)%> 
<% } %> 

risposta

292

credo che il modo in cui la ValidationSummary la bandiera funziona è accesa esporre ModelErrors per string.empty come chiave. Altrimenti si presume che si tratta di un errore di proprietà. Non vi è alcuna convalida che la stringa fornita sia/non sia una proprietà sul modello.

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

Hanno risolto questo problema in MVC3? –

+8

@LordCover: Sto indovinando che questo è "funzionante come progettato" e non un bug - il sovraccarico di ValidationSummary() usato di default esclude gli errori ModelState associati alle proprietà del modello stesso. Ciò lascia che tali errori siano rappresentati dalle chiamate Html.ValidationMessageFor() per ogni singola proprietà senza averle duplicate nel riepilogo. Ciò premesso, sembra che qualsiasi errore di 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à. –

+24

Solo una nota per altri implementatori: 'ModelState.AddModelError (string.Empty, ex);' non sembra funzionare neanche. È necessario utilizzare l'overload 'ModelState.AddModelError (string, string)' come mostrato sopra. Aggiornamento – WolfyUK

53

Questo funziona meglio, come si può mostrare validationMessage per una chiave specificata:

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

e visualizzarla in questo modo:

@Html.ValidationMessage("keyName") 
+0

Semplice. funzionante, la migliore risposta –

28

So che questo è una specie di vecchio e ha sono state contrassegnate come risposte con 147 voti in su, ma c'è qualcos'altro da considerare.

È possibile avere tutti gli errori del modello, la proprietà denominata e stringa.Tutte le chiavi uguali possono essere mostrate nel ValidationSummary se è necessario. C'è un sovraccarico nel 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); 

enter image description here

+4

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

+0

@Xeningem funziona. ty. – Willmore

0

Nel mio caso non funzionava a causa del ritorno.

Invece di usare:

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

ho usato:

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

E'una modella, quindi è obvius che ModelState.AddModelError("keyName","Message"); deve lavorare con un modello.

Questa risposta mostra perché. Adding validation with DataAnnotations

5

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 sul display aggiuntivo:

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

O

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

inserirlo nella parte più bassa og tuo Vista:

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

0

Se quasi tutto sembra giusto, un'altra cosa da guardare fuori per è quello di garantire che la sintesi di convalida non è dopo essere stata espressamente nascosta attraverso qualche CSS di esclusione come questa:

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

questo può anche causare il @Html.ValidationSummary di apparire nascosti, come la sintesi è dinamicamente reso con la classe validation-summary-valid.

Problemi correlati