ASP.NET MVC Html.ValidationS Summary (true) ไม่แสดงข้อผิดพลาดของแบบจำลอง


194

ฉันมีปัญหากับ Html.ValidationS Summary ฉันไม่ต้องการแสดงข้อผิดพลาดของคุณสมบัติใน ValidationS บทสรุป และเมื่อฉันตั้งค่า Html.ValidationS Summary (จริง) จะไม่แสดงข้อความผิดพลาดจาก ModelState เมื่อมีข้อยกเว้นบางอย่างในการดำเนินการควบคุมในสตริง

MembersManager.RegisterMember(member);

ส่วน catch เพิ่มข้อผิดพลาดใน ModelState:

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

แต่ ValidationS บทสรุปไม่แสดงข้อความข้อผิดพลาดนี้ เมื่อฉันตั้งค่า Html.ValidationSummary (false) ข้อความทั้งหมดแสดง แต่ฉันไม่ต้องการแสดงข้อผิดพลาดของคุณสมบัติ ฉันจะแก้ไขปัญหานี้ได้อย่างไร

นี่คือรหัสที่ฉันใช้:

รุ่น:

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

ควบคุม:

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

ดู:

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

คำตอบ:


324

ฉันเชื่อว่าวิธีการทำงานของการตรวจสอบความถูกต้องของธงคือจะแสดงเฉพาะ ModelErrors string.emptyเป็นคีย์ มิฉะนั้นจะถือว่าเป็นข้อผิดพลาดของคุณสมบัติ ข้อผิดพลาดที่กำหนดเองที่คุณเพิ่มมีคีย์ 'ข้อผิดพลาด' ดังนั้นมันจะไม่ปรากฏขึ้นเมื่อคุณเรียกใช้ ValidationS บทสรุป (จริง) คุณต้องเพิ่มข้อความแสดงข้อผิดพลาดที่กำหนดเองโดยใช้คีย์เปล่าดังนี้:

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

9
@ LordCover: ฉันเดาว่านี่คือ "ทำงานตามที่ออกแบบมา" และไม่ใช่ข้อผิดพลาด - โอเวอร์โหลดของ ValidationSummary () ที่ใช้โดยค่าเริ่มต้นไม่รวมข้อผิดพลาด ModelState ที่เกี่ยวข้องกับคุณสมบัติของแบบจำลองเอง สิ่งนี้ทำให้ข้อผิดพลาดเหล่านั้นถูกแสดงโดย Html.ValidationMessageFor () เรียกร้องให้แต่ละคุณสมบัติโดยไม่ทำซ้ำในการสรุป ในใจดูเหมือนว่าข้อผิดพลาดของแบบจำลองใด ๆ ที่เพิ่มด้วยคีย์ที่ไม่ว่างจะถือว่าเชื่อมโยงกับคุณสมบัติของโมเดลแม้ว่าคีย์จะไม่ตรงกับชื่อของคุณสมบัติ
Daniel Schaffer

26
เพียงทราบสำหรับผู้ใช้งานอื่น ๆ : ModelState.AddModelError(string.Empty, ex);ดูเหมือนจะไม่ทำงานอย่างใดอย่างหนึ่ง คุณต้องใช้งานModelState.AddModelError(string, string)เกินพิกัดตามที่แสดงด้านบน
wolfyuk

2
ปรับปรุง: ใน MVC4 ดูเหมือนจะไม่เป็นเช่นนั้นอีกต่อไป ModelState.AddModelError ("", ex.Message); ทำงาน
Neil Thompson

4
MVC5 ฉันยังต้องโทรหา ex.Message เพื่อให้มันใช้งานได้
smiggleworth

บันทึกวัน! MVC5 ยังคงมีบางประเด็น :)
juFo

67

วิธีนี้ใช้ได้ผลดีกว่าเนื่องจากคุณสามารถแสดง validationMessage สำหรับรหัสที่ระบุได้:

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

และแสดงแบบนี้:

    @Html.ValidationMessage("keyName")

28

ฉันรู้ว่านี่เป็นรุ่นเก่าและถูกทำเครื่องหมายเป็นคำตอบด้วยการโหวต 147 ครั้งขึ้นไป แต่มีอย่างอื่นที่ต้องพิจารณา

คุณสามารถมีข้อผิดพลาดของแบบจำลองทั้งหมดชื่อคุณสมบัติและสตริงคีย์ย่อยเหมือนกันแสดงใน ValidationSummary หากคุณต้องการ มีการโอเวอร์โหลดใน ValidationS บทสรุปที่จะทำเช่นนี้

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

ป้อนคำอธิบายรูปภาพที่นี่


5
ใช่ เพียงเปลี่ยน@Html.ValidationSummary(true, "", new { @class = "text-danger" })เป็น@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

อาจจะเป็นเช่นนั้น:

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

และในการแสดงเพิ่ม:

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

หรือ

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

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

การใช้บรรทัดนี้อาจมีประโยชน์


เพิ่มบรรทัดข้างต้นในไฟล์ cshtml
sachind

2

ในกรณีของฉันมันไม่ทำงานเพราะกลับมา

แทนที่จะใช้:

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

ฉันใช้:

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

เป็นโมเดลดังนั้นจึงเป็นรูปแบบที่ModelState.AddModelError("keyName","Message");ต้องทำงานกับโมเดล

คำตอบนี้แสดงว่าทำไม การเพิ่มการตรวจสอบความถูกต้องด้วย DataAnnotations


0

หากเกือบทุกอย่างดูเหมือนถูกต้องสิ่งอื่นที่ควรระวังคือเพื่อให้แน่ใจว่าสรุปการตรวจสอบความถูกต้องไม่ถูกซ่อนอย่างชัดเจนผ่านการแทนที่CSSบางอย่างเช่นนี้:

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

นี่อาจเป็นสาเหตุให้การ@Html.ValidationSummaryปรากฏที่ซ่อนอยู่เนื่องจากการสรุปถูกแสดงผลแบบไดนามิกกับvalidation-summary-validคลาส


0

คุณสามารถลอง,

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

หมายเหตุ - สิ่งนี้จะต้องเป็น <div> หากเป็น <span> มันจะไม่แสดงผล
Stephen Angell

-4

เพิ่มในส่วนที่ต่ำที่สุดและมุมมองของคุณ:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.