Menampilkan pesan kesalahan pada tampilan dari controller asp.net mvc 5

Saya baru dalam pengembangan web dan mencoba untuk belajar ASP.Net MVC 5. Saya mencari satu record di database jika record tersebut tidak ditemukan maka saya ingin menampilkan pesan error kepada user. Di bawah ini adalah usaha saya:

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

Lihat:

<p>@ViewBag.ErrorMessage</p>

ViewModel

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

Tetapi saya membaca di suatu tempat bahwa saya harus meletakkan satu properti di model tampilan saya dan mengatur pesan kesalahan pada properti itu. Saya bingung sekarang, bagaimana cara mencapainya dan bagaimana cara menampilkan error di View? Dan yang mana yang direkomendasikan/praktek terbaik?

Larutan

Tapi saya membaca di suatu tempat bahwa saya harus meletakkan satu properti di model tampilan saya dan mengatur pesan kesalahan pada properti tersebut. Saya bingung sekarang, bagaimana cara mencapai hal itu dan bagaimana cara menampilkan error di View? Dan yang mana yang mana yang direkomendasikan/praktek terbaik?

Praktik terbaik adalah dengan mengubah properti kamus ModelState dari controller Anda seperti ini:

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

Kemudian dalam tampilan Anda tambahkan baris di bawah ini di samping bidang email Anda;

@Html.ValidationMessageFor(m => m.Email)
Komentar (8)

Tapi saya membaca di suatu tempat bahwa saya harus meletakkan satu properti di model tampilan saya dan mengatur pesan kesalahan pada properti itu.

Itu benar. Anda bisa menambahkan pesan kesalahan ke model tampilan Anda:

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

    public string ErrorMessage { get; set; }
}

dan kemudian mengatur properti ini pada model tampilan Anda dan meneruskan model tampilan ke tampilan:

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

dan akhirnya dalam tampilan yang diketik dengan kuat Anda menggunakan properti pada model Anda:

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

Jadi pada dasarnya di sini kita mengganti penggunaan ViewBag dengan model tampilan yang diketik dengan kuat.

Komentar (2)

Bagi saya, menerima anwser bukanlah praktik terbaik. Kita dapat menangani semua kesalahan dalam anotasi.
Dalam ViewModel kita, kita menentukan ErrorMessage untuk properites kita.

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

Dalam pengendali kita

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

Dan tampilan kita

@Html.ValidationMessageFor(model => model.Login)
@Html.EditorFor(model => model.Login)
@Html.ValidationMessageFor(model => model.Password)
@Html.EditorFor(model => model.Password)
Komentar (2)