ASP.NET MVC Html.ValidationSummary (true) không hiển thị lỗi mô hình


194

Tôi có một số vấn đề với Html.ValidationSummary. Tôi không muốn hiển thị lỗi thuộc tính trong ValidationSummary. Và khi tôi đặt Html.ValidationSummary (true), nó không hiển thị các thông báo lỗi từ ModelState. Khi có một số Ngoại lệ trong hành động của bộ điều khiển trên chuỗi

MembersManager.RegisterMember(member);

phần bắt thêm một lỗi cho ModelState:

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

Nhưng ValidationSummary không hiển thị thông báo lỗi này. Khi tôi đặt Html.ValidationSummary (false), tất cả các thông báo đều hiển thị, nhưng tôi không muốn hiển thị lỗi thuộc tính. Làm thế nào tôi có thể khắc phục vấn đề này?

Đây là mã tôi đang sử dụng:

Mô hình:

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

Điều khiển:

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

Lượt xem:

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

Câu trả lời:


324

Tôi tin rằng cách hoạt động của cờ ValidationSummary là nó sẽ chỉ hiển thị ModelErrors string.emptylàm khóa. Nếu không, nó được coi là một lỗi tài sản. Lỗi tùy chỉnh mà bạn thêm có khóa 'lỗi', do đó, nó sẽ không hiển thị khi bạn gọi Xác thựcSummary (đúng). Bạn cần thêm thông báo lỗi tùy chỉnh của mình bằng một phím trống như thế này:

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover: Tôi đoán đây là "hoạt động như thiết kế" và không phải là lỗi - sự quá tải của ValidationSummary () được sử dụng theo mặc định loại trừ các lỗi ModelState liên quan đến các thuộc tính của chính mô hình. Điều này để lại các lỗi được biểu thị bằng các lệnh gọi Html.ValidationMessageFor () cho từng thuộc tính riêng lẻ mà không bị trùng lặp trong bản tóm tắt. Điều đó trong tâm trí, dường như bất kỳ lỗi mô hình nào được thêm bằng khóa không trống đều được coi là có liên quan đến thuộc tính mô hình, ngay cả khi khóa không khớp với tên của một thuộc tính.
Daniel Schaffer

26
Chỉ là một lưu ý cho những người thực hiện khác: ModelState.AddModelError(string.Empty, ex);dường như cũng không hoạt động. Bạn phải sử dụng ModelState.AddModelError(string, string)quá tải như hình trên.
wolfyuk

2
Cập nhật: Trong MVC4 điều này dường như không còn là trường hợp nữa. ModelState.AddModelError ("", ex.Message); hoạt động
Neil Thompson

4
MVC5 Tôi vẫn cần gọi ex.Message để làm cho nó hoạt động.
smiggleworth

Đã cứu sống ngày! MVC5 vẫn còn một số vấn đề :)
juFo

67

Điều này hoạt động tốt hơn, vì bạn có thể hiển thị verifyMessage cho một khóa được chỉ định:

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

và hiển thị nó như thế này:

    @Html.ValidationMessage("keyName")

28

Tôi biết đây là loại cũ và đã được đánh dấu là câu trả lời với 147 phiếu bầu, nhưng có một cái gì đó khác để xem xét.

Bạn có thể có tất cả các lỗi mô hình, thuộc tính có tên và chuỗi. Các khóa tương tự, sẽ được hiển thị trong Xác thựcSummary nếu bạn cần. Có một sự quá tải trong ValidationSummary sẽ làm điều này.

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

nhập mô tả hình ảnh ở đây


5
Đúng! Chỉ cần đổi @Html.ValidationSummary(true, "", new { @class = "text-danger" })thành@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

Có lẽ như thế:

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

Và trong màn hình thêm:

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

HOẶC LÀ

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

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

Sử dụng dòng này có thể hữu ích


Thêm dòng trên trong tập tin cshtml.
sachind 31/12/18

2

Trong trường hợp của tôi, nó không hoạt động vì sự trở lại.

Thay vì sử dụng:

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

Tôi đã sử dụng:

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

Nó mô hình, vì vậy nó là obvius ModelState.AddModelError("keyName","Message");phải làm việc với một mô hình.

Câu trả lời này cho thấy tại sao. Thêm xác thực với DataAnnotations


0

Nếu gần như mọi thứ có vẻ đúng, một điều khác cần chú ý là đảm bảo rằng tóm tắt xác thực không bị ẩn rõ ràng thông qua một số ghi đè CSS như thế này:

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

Điều này cũng có thể khiến @Html.ValidationSummaryẩn xuất hiện, vì tóm tắt được hiển thị động với validation-summary-validlớp.


0

Bạn co thể thử,

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

lưu ý - đây phải là <div>, nếu đó là <span> thì nó sẽ không hiển thị.
Stephen Angell

-4

THÊM nó ở phần dưới cùng trong chế độ xem của bạn:

@section ScScript {@ Sc scripts.Render ("~ / bundles / jqueryval")}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.