ASP.NET MVC Html.ValidationSummary (true) tidak menampilkan kesalahan model

194

Saya memiliki beberapa masalah dengan Html.ValidationSummary. Saya tidak ingin menampilkan kesalahan properti di ValidationSummary. Dan ketika saya mengatur Html.ValidationSummary (true) tidak menampilkan pesan kesalahan dari ModelState. Ketika ada beberapa Pengecualian dalam aksi pengontrol pada string

MembersManager.RegisterMember(member);

bagian tangkapan menambahkan kesalahan ke ModelState:

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

Tetapi ValidationSummary tidak menampilkan pesan kesalahan ini. Ketika saya mengatur Html.ValidationSummary (false) semua pesan ditampilkan, tetapi saya tidak ingin menampilkan kesalahan properti. Bagaimana saya bisa memperbaiki masalah ini?

Ini kode yang saya gunakan:

Model:

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

Pengendali:

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

Melihat:

<% 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
sumber

Jawaban:

324

Saya percaya cara kerja flag ValidationSummary adalah hanya akan menampilkan ModelErrors string.emptysebagai kuncinya. Kalau tidak diasumsikan itu adalah kesalahan properti. Kesalahan khusus yang Anda tambahkan memiliki kunci 'kesalahan' sehingga tidak akan ditampilkan ketika Anda memanggil ValidationSummary (true). Anda perlu menambahkan pesan kesalahan khusus Anda dengan kunci kosong seperti ini:

ModelState.AddModelError(string.Empty, ex.Message);
Tusukan
sumber
9
@LordCover: Saya rasa ini "berfungsi seperti yang dirancang" dan bukan bug - kelebihan dari ValidationSummary () yang digunakan secara default tidak termasuk kesalahan ModelState yang terkait dengan sifat-sifat model itu sendiri. Ini membiarkan kesalahan-kesalahan itu diwakili oleh panggilan Html.ValidationMessageFor () untuk setiap properti individual tanpa harus diduplikasi dalam ringkasan. Dalam pikiran itu, tampak bahwa setiap kesalahan model yang ditambahkan dengan kunci yang tidak kosong diasumsikan terkait dengan properti model, bahkan jika kunci tersebut tidak cocok dengan nama properti.
Daniel Schaffer
26
Hanya sebuah catatan untuk pelaksana lainnya: ModelState.AddModelError(string.Empty, ex);sepertinya juga tidak berfungsi. Anda harus menggunakan ModelState.AddModelError(string, string)kelebihan seperti yang ditunjukkan di atas.
wolfyuk
2
pembaruan: Dalam MVC4 ini tampaknya tidak lagi menjadi masalah. ModelState.AddModelError ("", ex.Message); bekerja
Neil Thompson
4
MVC5 Saya masih perlu menghubungi ex.Message untuk membuatnya bekerja.
smiggleworth
menyelamatkan hari! MVC5 masih memiliki beberapa masalah :)
juFo
67

Ini berfungsi lebih baik, karena Anda dapat menampilkan validationMessage untuk kunci yang ditentukan:

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

dan tampilkan seperti ini:

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

Saya tahu ini agak tua dan telah ditandai sebagai jawaban dengan 147 suara, tetapi ada hal lain yang perlu dipertimbangkan.

Anda dapat memiliki semua kesalahan model, properti yang dinamai dan string. Kunci yang sama, ditampilkan di Ringkasan Validation jika Anda perlu. Ada kelebihan dalam Ringkasan Validation yang akan melakukan ini.

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

masukkan deskripsi gambar di sini

Levitikon
sumber
5
Iya! Ubah saja @Html.ValidationSummary(true, "", new { @class = "text-danger" })ke@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem
7

Mungkin seperti itu:

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

Dan di layar tambahkan:

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

ATAU

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

Menggunakan baris ini mungkin membantu

sachind
sumber
Tambahkan baris di atas dalam file cshtml.
sachind
2

Dalam kasus saya itu tidak berfungsi karena pengembalian.

Alih-alih menggunakan:

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

Saya menggunakan:

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

Itu Model, jadi sangat membingungkan ModelState.AddModelError("keyName","Message"); harus bekerja dengan model.

Jawaban ini menunjukkan mengapa. Menambahkan validasi dengan DataAnnotations

Allan Patrick Patzlaff
sumber
0

Jika hampir semuanya tampak benar, hal lain yang perlu diperhatikan adalah memastikan bahwa ringkasan validasi tidak disembunyikan secara eksplisit melalui beberapa CSS override seperti ini:

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

Ini juga dapat menyebabkan itu @Html.ValidationSummarytampak tersembunyi, karena ringkasan secara dinamis diberikan dengan validation-summary-validkelas.

alex
sumber
0

Anda dapat mencoba,

<div asp-validation-summary="All" class="text-danger"></div>
Adrita Sharma
sumber
note - ini harus <div>, jika <span> tidak akan di-render.
Stephen Angell
-4

TAMBAHKAN di bagian paling bawah dan Tampilan Anda:

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

rONIT
sumber