2010-05-12 17 views
174

Mam problem z plikiem Html.ValidationSummary. Nie chcę wyświetlać błędów właściwości w ValidationSummary. A kiedy ustawię Html.ValidationSummary (true), nie wyświetlają się komunikaty o błędach z ModelState. Gdy istnieje jakiś wyjątek w akcji kontrolera na ciągASP.NET MVC Html.ValidationSummary (true) nie wyświetla błędów modelu

MembersManager.RegisterMember(member); 

sekcji catch dodaje błąd do ModelState:

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

Ale ValidationSummary nie wyświetla komunikat o błędzie. Po ustawieniu Html.ValidationSummary (false) wszystkie komunikaty są wyświetlane, ale nie chcę wyświetlać błędów właściwości. Jak mogę rozwiązać ten problem?

Oto kod używam:

Model:

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

Kontroler:

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

Widok:

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

Odpowiedz

292

Uważam, że sposób ValidationSummary flaga działa, będzie działać ly wyświetlają ModelErrors dla string.empty jako klucz. W przeciwnym razie zakłada się, że jest to błąd właściwości. Nie ma sprawdzenia, czy podany łańcuch jest/nie jest właściwością modelu.

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

Czy poprawiono ten problem w MVC3? –

+8

@LordCover: Zgaduję, że to "działa zgodnie z założeniami", a nie błąd - domyślnie używane przeciążenie ValidationSummary() wyklucza błędy ModelState związane z właściwościami samego modelu. To pozostawia te błędy, które mają być reprezentowane przez Html.ValidationMessageFor() wywołuje dla każdej właściwości, bez ich duplikacji w podsumowaniu. Mając to na uwadze, wydaje się, że jakikolwiek błąd modelu dodany za pomocą niepustego klucza jest skojarzony z właściwością modelu, nawet jeśli klucz nie pasuje do nazwy właściwości. –

+24

Uwaga dla innych implementatorów: 'ModelState.AddModelError (string.Empty, ex);' nie wydaje się działać. Musisz użyć przeciążenia 'ModelState.AddModelError (string, string)' jak pokazano powyżej. Aktualizacja – WolfyUK

53

To działa lepiej, jak można pokazać validationMessage dla określonego klucza:

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

i wyświetlić go w ten sposób:

@Html.ValidationMessage("keyName") 
+0

Proste. działa, najlepsza odpowiedź –

28

Wiem, że to trochę stary i ma zostały oznaczone jako odpowiedzi z 147 głosami do góry, ale jest jeszcze coś do rozważenia.

Możesz mieć wszystkie błędy modelu, właściwość o nazwie i string.Empty keys alike, być wyświetlane w ValidationSummary, jeśli potrzebujesz. W ValidationSummary występuje przeciążenie, które spowoduje to.

// 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

Tak! Po prostu zmień '@ Html.ValidationSummary (true," ", new {@class =" text-danger "})' na '@ Html.ValidationSummary (false," ", new {@class =" text-danger "})) ' – Xeningem

+0

@ Xeningem to działa. ty. – Willmore

0

W moim przypadku to nie działa z powodu zwrotu.

Zamiast:

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

użyłem:

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

its model, więc jest obvius że ModelState.AddModelError("keyName","Message"); musi pracować z modelem.

Ta odpowiedź pokazuje, dlaczego. Adding validation with DataAnnotations

5

Może tak:

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

A Display Dodaj:

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

LUB

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

dodać go w najniższej części og swojej Widok:

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

0

Jeśli niemal wszystko wydaje się w porządku, kolejna rzecz, aby zwrócić uwagę na to, aby upewnić się, że nie jest to podsumowanie walidacji jest wyraźnie ukryty przez jakiegoś CSS ręcznym tak:

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

może to również spowodować @Html.ValidationSummary do pojawiają się ukryte, gdy podsumowanie jest dynamicznie renderowane z klasą validation-summary-valid.

Powiązane problemy