ASP.NET MVC Html.ValidationSummary (true) zeigt keine Modellfehler an

194

Ich habe ein Problem mit Html.ValidationSummary. Ich möchte keine Eigenschaftsfehler in ValidationSummary anzeigen. Und wenn ich Html.ValidationSummary (true) setze, werden keine Fehlermeldungen von ModelState angezeigt. Wenn es eine Ausnahme in der Controller-Aktion für die Zeichenfolge gibt

MembersManager.RegisterMember(member);

Der Abschnitt catch fügt dem ModelState einen Fehler hinzu:

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

ValidationSummary zeigt diese Fehlermeldung jedoch nicht an. Wenn ich Html.ValidationSummary (false) festlege, werden alle Nachrichten angezeigt, aber ich möchte keine Eigenschaftsfehler anzeigen. Wie kann ich dieses Problem beheben?

Hier ist der Code, den ich verwende:

Modell:

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

Regler:

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

Aussicht:

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

Antworten:

324

Ich glaube, dass das ValidationSummary-Flag so funktioniert, dass nur ModelErrors string.emptyals Schlüssel angezeigt werden . Andernfalls wird angenommen, dass es sich um einen Eigenschaftsfehler handelt. Der benutzerdefinierte Fehler, den Sie hinzufügen, hat den Schlüssel 'error', sodass er beim Aufrufen von ValidationSummary (true) nicht angezeigt wird. Sie müssen Ihre benutzerdefinierte Fehlermeldung mit einem leeren Schlüssel wie folgt hinzufügen:

ModelState.AddModelError(string.Empty, ex.Message);
Jab
quelle
9
@ LordCover: Ich vermute, dies funktioniert "wie geplant" und ist kein Fehler. Die standardmäßig verwendete Überlastung von ValidationSummary () schließt ModelState-Fehler aus, die mit den Eigenschaften des Modells selbst verbunden sind. Dadurch können diese Fehler durch Html.ValidationMessageFor () -Aufrufe für jede einzelne Eigenschaft dargestellt werden, ohne dass sie in der Zusammenfassung dupliziert werden. Vor diesem Hintergrund wird angenommen, dass jeder mit einem nicht leeren Schlüssel hinzugefügte Modellfehler mit einer Modelleigenschaft verknüpft ist, auch wenn der Schlüssel nicht mit dem Namen einer Eigenschaft übereinstimmt.
Daniel Schaffer
26
Nur ein Hinweis für andere Implementierer: ModelState.AddModelError(string.Empty, ex);Scheint auch nicht zu funktionieren. Sie müssen die ModelState.AddModelError(string, string)Überlastung wie oben gezeigt verwenden.
Wolfyuk
2
Update: In MVC4 scheint dies nicht mehr der Fall zu sein. ModelState.AddModelError ("", ex.Message); Werke
Neil Thompson
4
MVC5 Ich musste immer noch die ex.Message anrufen, damit es funktioniert.
Smiggleworth
hat den Tag gerettet! MVC5 hat noch einige Probleme :)
JuFo
67

Dies funktioniert besser, da Sie validationMessage für einen angegebenen Schlüssel anzeigen können:

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

und zeige es so an:

    @Html.ValidationMessage("keyName")
ingvesund
quelle
28

Ich weiß, dass dies etwas alt ist und als Antwort mit 147 Stimmen markiert wurde, aber es gibt noch etwas zu beachten.

Sie können alle Modellfehler, den Namen der Eigenschaft und die Zeichenfolge. Leere Schlüssel werden bei Bedarf in der ValidationSummary angezeigt. Die ValidationSummary enthält eine Überlastung, die dies bewirkt.

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

Geben Sie hier die Bildbeschreibung ein

Levitikon
quelle
5
Ja! Wechseln Sie einfach @Html.ValidationSummary(true, "", new { @class = "text-danger" })zu@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem
7

Vielleicht so:

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

Und im Display hinzufügen:

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

ODER

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>
Piotr Knut
quelle
5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

Die Verwendung dieser Zeile kann hilfreich sein

sachind
quelle
Fügen Sie die obige Zeile in die cshtml-Datei ein.
Sachind
2

In meinem Fall hat es wegen der Rückkehr nicht funktioniert.

Anstatt zu verwenden:

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

Ich benutzte:

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

Es ist ein Modell, also ist es offensichtlich, dass ModelState.AddModelError("keyName","Message");mit einem Modell gearbeitet werden muss.

Diese Antwort zeigt warum. Hinzufügen einer Validierung mit DataAnnotations

Allan Patrick Patzlaff
quelle
0

Wenn fast alles richtig erscheint, müssen Sie auch darauf achten, dass die Validierungszusammenfassung nicht explizit über eine CSS- Überschreibung wie diese ausgeblendet wird :

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

Dies kann auch dazu führen, dass das @Html.ValidationSummarySymbol ausgeblendet erscheint, da die Zusammenfassung mit der validation-summary-validKlasse dynamisch gerendert wird .

Alex
quelle
0

Du kannst es versuchen,

<div asp-validation-summary="All" class="text-danger"></div>
Adrita Sharma
quelle
Hinweis - Dies muss ein <div> sein. Wenn es ein <span> ist, wird es nicht gerendert.
Stephen Angell
-4

Fügen Sie es im untersten Teil Ihrer Ansicht hinzu:

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

ronIT
quelle