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

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

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")

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


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>

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

Die Verwendung dieser Zeile kann hilfreich sein


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


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 .


0

Du kannst es versuchen,

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.