web-dev-qa-db-fra.com

Afficher un message d'erreur sur la vue du contrôleur asp.net mvc 5

Je suis nouveau dans le développement Web et j'essaie d'apprendre ASP.Net MVC 5. Je recherche un enregistrement dans la base de données si l'enregistrement n'est pas trouvé, je souhaite afficher un message d'erreur à l'intention de l'utilisateur. Ci-dessous ma tentative:

Manette

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

Vue:

<p>@ViewBag.ErrorMessage</p>

ViewModel

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

Mais j'ai lu quelque part que je devrais mettre une propriété dans mon modèle de vue et définir le message d'erreur sur cette propriété. Je suis confus maintenant, comment y parvenir et comment afficher l'erreur dans View alors? Et quelle est la meilleure pratique recommandée?

15
Unbreakable

Mais j'ai lu quelque part que je devrais mettre une propriété dans mon modèle de vue et définir le message d'erreur sur cette propriété. Je suis confus maintenant, comment faire y parvenir et comment afficher l’erreur dans View alors? Et lequel est la meilleure pratique recommandée?

La meilleure pratique consiste à modifier la propriété de dictionnaire ModelState de votre contrôleur comme suit:

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

Ensuite, dans votre vue, ajoutez la ligne ci-dessous à côté de votre champ de courrier électronique;

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

Mais j'ai lu quelque part que je devrais mettre une propriété dans mon modèle de vue et définir le message d'erreur sur cette propriété.

C'est correct. Vous pouvez ajouter le message d'erreur à votre modèle de vue:

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

    public string ErrorMessage { get; set; }
}

puis définissez cette propriété sur votre modèle de vue et transmettez-le à la vue:

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

enfin, dans votre vue fortement typée, utilisez la propriété de votre modèle:

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

Donc, fondamentalement, nous remplaçons ici l'utilisation de ViewBag par un modèle de vue fortement typé.

3
Darin Dimitrov

Quant à moi accepté, la réponse n’est pas la meilleure pratique. Nous pouvons gérer toutes les erreurs dans les annotations.
Dans notre ViewModel nous spécifions ErrorMessages pour nos propriétés.

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

Dans notre contrôleur

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

Et notre vue

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