web-dev-qa-db-de.com

Fehlermeldung in der Ansicht vom Controller asp.net mvc anzeigen 5

Ich bin neu in der Webentwicklung und versuche, ASP.Net MVC 5 zu lernen. Ich suche nach einem Datensatz in der Datenbank, wenn der Datensatz nicht gefunden wird, dann möchte ich dem Benutzer eine Fehlermeldung anzeigen. Unten ist mein Versuch:

Controller

    [HttpGet]
    public ActionResult Search()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Search(ForgotPasswordMV viewModel)
    {
        if (Temp.Check(viewModel.Email))
            return RedirectToAction("VerifyToken", new { query = viewModel.Email });
        else
        {
            ViewBag.ErrorMessage = "Email not found or matched";
            return View();
        }
    }

Aussicht:

<p>@ViewBag.ErrorMessage</p>

ViewModel

public class ForgotPasswordMV
{
    [Display(Name = "Enter your email"), Required]
    public string Email { get; set; }
}

Ich habe jedoch irgendwo gelesen, dass ich eine Eigenschaft in mein Ansichtsmodell einfügen und die Fehlermeldung auf diese Eigenschaft setzen sollte. Ich bin jetzt verwirrt, wie das zu erreichen ist und wie der Fehler dann in View angezeigt wird. Und welche ist die empfohlene/beste Praxis?

15
Unbreakable

Aber ich habe irgendwo gelesen, dass ich eine Eigenschaft in meinem Ansichtsmodell einfügen sollte und legen Sie die Fehlermeldung für diese Eigenschaft fest. Ich bin jetzt verwirrt, wie das erreichen und wie wird dann der Fehler in View angezeigt? Und welches ist die empfohlene/bewährte Praxis?

Am besten ändern Sie die ModelState-Dictionary-Eigenschaft Ihres Controllers folgendermaßen:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Search(ForgotPasswordMV viewModel)
{
    // ... 
    else
    {
        ModelState.AddModelError("Email", "Email not found or matched");
        return View(viewModel);
    }
}

Fügen Sie dann in Ihrer Ansicht die folgende Zeile neben Ihrem E-Mail-Feld ein.

@Html.ValidationMessageFor(m => m.Email)
27
CodeNotFound

Ich habe jedoch irgendwo gelesen, dass ich eine Eigenschaft in mein Ansichtsmodell einfügen und die Fehlermeldung auf diese Eigenschaft setzen sollte.

Das ist richtig. Sie können die Fehlermeldung zu Ihrem Ansichtsmodell hinzufügen:

public class ForgotPasswordMV
{
    [Display(Name = "Enter your email"), Required]
    public string Email { get; set; }

    public string ErrorMessage { get; set; }
}

legen Sie dann diese Eigenschaft in Ihrem Ansichtsmodell fest und übergeben Sie das Ansichtsmodell an die Ansicht:

...
else
{
    viewModel.ErrorMessage = "Email not found or matched";
    return View(viewModel);
}

und schließlich verwenden Sie in Ihrer stark typisierten Ansicht die Eigenschaft Ihres Modells:

@model ForgotPasswordMV
...
<p>@Model.ErrorMessage</p>

Im Grunde ersetzen wir hier die Verwendung von ViewBag durch ein stark typisiertes Ansichtsmodell.

3
Darin Dimitrov

Für mich akzeptierte Antwort ist nicht die beste Praxis. Wir können alle Fehler in Anmerkungen behandeln.
In unserem ViewModel geben wir ErrorMessages für unsere Eigenschaften an.

public class UserLoginViewModel
{
    [Required(ErrorMessage = "User name is required")]
    [Display(Name = "User name")]
    [StringLength(500, ErrorMessage = "User name is too short", MinimumLength = 3)]
    public string Login { get; set; }

    [Required(ErrorMessage = "Password is required")]
    [Display(Name = "Password")]
    public string Password { get; set; }
}

In unserem Controller

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(UserLoginViewModel model)
{
    if (!this.ModelState.IsValid)
    {
        return this.View();
    }
    ...
}

Und unsere Sicht

@Html.ValidationMessageFor(model => model.Login)
@Html.EditorFor(model => model.Login)
@Html.ValidationMessageFor(model => model.Password)
@Html.EditorFor(model => model.Password)
1
Marek

Wenn jemand eine einfache Lösung und NICHTS STÄNDIGES sucht, kann er diese Antwort gerne verwenden, da dies mir geholfen hat. Verwenden Sie dieses Update NICHT, wenn Sie sich um die Sicherheit Ihrer Anwendung sorgen müssen.

In Ihrem Controller:

TempData["Message"] = "This is my Error";

In Ihrer Error.cshtml-Datei:

<h3><strong>@TempData["Message"]</strong></h3>

Ergebnis:

enter image description here

0
Zach Pedigo