การตรวจสอบที่ไม่สร้างความรำคาญไม่ทำงานกับเนื้อหาแบบไดนามิก


97

ฉันมีปัญหาในการพยายามรับการตรวจสอบความถูกต้อง jquery ที่ไม่สร้างความรำคาญเพื่อทำงานกับมุมมองบางส่วนที่โหลดแบบไดนามิกผ่านการเรียก AJAX

ฉันใช้เวลาหลายวันในการพยายามทำให้รหัสนี้ทำงานโดยไม่มีโชค

นี่คือมุมมอง:

@model MvcApplication2.Models.test

@using (Html.BeginForm())
{
 @Html.ValidationSummary(true);
 <div id="res"></div>
 <input id="submit" type="submit" value="submit" />
}

มุมมองบางส่วน:

@model MvcApplication2.Models.test

@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);

<script type="text/javascript" >
  $.validator.unobtrusive.parse(document);
</script>

นางแบบ:

  public class test
  {
    [Required(ErrorMessage= "required field")]
    public int MyProperty { get; set; }
  }

ตัวควบคุม:

    public ActionResult GetView()
    {
        return PartialView("Test");
    }

และสุดท้ายจาวาสคริปต์:

$(doument).ready(function () {
$.ajax({
    url: '/test/getview',
    success: function (res) {

        $("#res").html(res);
        $.validator.unobtrusive.parse($("#res"));
    }
});

$("#submit").click(function () {
    if ($("form").valid()) {
        alert('valid');
        return true;
    } else {
        alert('not valid');
        return false;
    }
});

การตรวจสอบความถูกต้องไม่ทำงาน แม้ว่าฉันจะไม่กรอกข้อมูลใด ๆ ในเท็กซ์บ็อกซ์ แต่เหตุการณ์ส่งจะแสดงการแจ้งเตือน ('ถูกต้อง')

อย่างไรก็ตามหากแทนที่จะโหลดมุมมองแบบไดนามิกฉันใช้ @Html.Partial("test", Model)การแสดงผลมุมมองบางส่วนในมุมมองหลัก (และฉันไม่ได้เรียก AJAX) การตรวจสอบความถูกต้องก็ใช้ได้ดี

อาจเป็นเพราะถ้าฉันโหลดเนื้อหาแบบไดนามิกการควบคุมยังไม่มีอยู่ใน DOM แต่ฉันโทรไป $.validator.unobtrusive.parse($("#res")); ซึ่งน่าจะเพียงพอที่จะให้ validator เกี่ยวกับตัวควบคุมที่โหลดใหม่ ...

ใครสามารถช่วย?


ฉันก็มีปัญหาเหมือนกัน แต่ใน mvc 2 ฉันทำตามทีละขั้นตอนดังนี้: weblogs.asp.net/imranbaloch/archive/2010/07/11/…สิ่งนี้อาจช่วยคุณได้เช่นกัน weblogs.asp.net/imranbaloch/archive/2011/03/05/…หวังว่านี่จะช่วยได้ :)
Naresh Parmar

2
หมายเหตุunobtrusive.parseฟังก์ชันนี้ใช้ตัวเลือกเป็นอาร์กิวเมนต์ไม่ใช่องค์ประกอบ
Fred

คำตอบ:


230

หากคุณพยายามแยกวิเคราะห์ฟอร์มที่แยกวิเคราะห์แล้วจะไม่อัปเดต

สิ่งที่คุณสามารถทำได้เมื่อคุณเพิ่มองค์ประกอบแบบไดนามิกลงในแบบฟอร์มคือ

  1. คุณสามารถลบการตรวจสอบความถูกต้องของแบบฟอร์มและตรวจสอบความถูกต้องได้เช่นนี้:

    var form = $(formSelector)
        .removeData("validator") /* added by the raw jquery.validate plugin */
        .removeData("unobtrusiveValidation");  /* added by the jquery unobtrusive plugin*/
    
    $.validator.unobtrusive.parse(form);
    
  2. เข้าถึงunobtrusiveValidationข้อมูลของแบบฟอร์มโดยใช้dataวิธีjquery :

    $(form).data('unobtrusiveValidation')
    

    จากนั้นเข้าถึงคอลเล็กชันกฎและเพิ่มแอตทริบิวต์องค์ประกอบใหม่ (ซึ่งค่อนข้างซับซ้อน)

คุณยังสามารถอ่านบทความนี้เกี่ยวกับการใช้การตรวจสอบ jquery ที่ไม่สร้างความรำคาญกับเนื้อหาแบบไดนามิกใน ASP.Net MVCสำหรับปลั๊กอินที่ใช้สำหรับการเพิ่มองค์ประกอบแบบไดนามิกลงในฟอร์ม ปลั๊กอินนี้ใช้โซลูชันที่ 2


17
เพื่อนคุณร็อคช่วยวันของฉันโดยสิ้นเชิง! คำตอบสุดเจ๋ง!
Dimitar Dimitrov

ฉันกลัวว่าฉันควรจะเชิญมันด้วยตัวเอง สคริปต์จากหน้านั้นทำงานได้อย่างมีเสน่ห์
cezarypiatek

รหัสใช้งานได้ดี - อัปเดตอย่างรวดเร็ว (ถ้าฉันทำได้) 1. ฉันใช้สิ่งที่น่าพิศวงและได้รับชื่อของเขตข้อมูลอย่างดีดูเหมือนว่าจะมีปัญหา $ .validator.unobtrusive.parseDynamicContent ('แบบฟอร์ม'); (เพื่อรับฟิลด์ทั้งหมด) ในตอนท้ายเมื่อส่ง 2. นี่เป็นสิ่งที่ดีjohnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/…เพื่อให้คุณมีวิธีตั้งชื่อฟิลด์ (ซึ่งดูเหมือนว่าจำเป็นฉันใช้ jquery bootstrap ที่ไม่สร้างความรำคาญบนด้านบนของอีก 2 ตัวดังนั้นฉันจึง สถานการณ์อาจแตกต่างกัน)
Richard Housham

โปรดทราบว่าการตั้งค่ารูปแบบเฉพาะใด ๆ ที่คุณใช้$("form").data("validator").settingsจะถูกลบออก$(formSelector).removeData("validator")และแทนที่ด้วยค่าเริ่มต้น$.validator.defaultsเมื่อวิเคราะห์ฟอร์มใหม่ นี่เป็นวิธีที่ยอดเยี่ยมในการรวมฟิลด์ไดนามิก แต่อย่าลืมทำซ้ำรหัสเริ่มต้นที่กำหนดเองในการแยกวิเคราะห์ใหม่แต่ละครั้ง
KyleMit

19

นอกจากคำตอบของ Nadeem Khedr แล้ว ....

หากคุณโหลดแบบฟอร์มใน DOM ของคุณแบบไดนามิกแล้วโทร

jQuery.validator.unobtrusive.parse(form); 

(ด้วยบิตพิเศษที่กล่าวถึง) จากนั้นจะส่งแบบฟอร์มนั้นโดยใช้ ajax อย่าลืมโทร

$(form).valid()

ซึ่งส่งคืนจริงหรือเท็จ (และเรียกใช้การตรวจสอบความถูกต้องจริง) ก่อนที่คุณจะส่งแบบฟอร์ม


สวัสดีฉันประสบปัญหาเดียวกัน ฉันกำลังแสดงมุมมองแบบไดนามิกของฉันในป๊อปอัป (กล่องโต้ตอบ jquery) การตรวจสอบความถูกต้องที่ไม่เป็นการรบกวนไม่ทำงาน ฉันจะเรียก $ (form) .valid () ได้ที่ไหนในมุมมองแบบไดนามิกของฉันหรือที่อื่น
mmssaann

ฉันมักจะป้องกันไม่ให้ส่งแบบฟอร์มโดยส่งคืนเท็จภายใน $ (form) .submit เพราะฉันกำลังส่ง AJAX แต่ฉันก็ต้องการวิธีที่จะไม่เรียก AJAX submit เมื่อการตรวจสอบล้มเหลว $ (form) .valid () คือคำตอบ! ขอบคุณ!
jgerman

6

เพิ่มสิ่งนี้ใน _Layout.cshtml ของคุณ

 $(function () {
        //parsing the unobtrusive attributes when we get content via ajax
        $(document).ajaxComplete(function () {
            $.validator.unobtrusive.parse(document);
        });
    });

3
สิ่งนี้ไร้ประสิทธิภาพโดยเฉพาะ
Liam

6

น่าแปลกที่เมื่อฉันดูคำถามนี้เอกสาร ASP.NET อย่างเป็นทางการยังไม่มีข้อมูลเกี่ยวกับparse()วิธีการที่ไม่สร้างความรำคาญหรือวิธีใช้กับเนื้อหาแบบไดนามิก ฉันมีอิสระในการสร้างปัญหาที่ repo ของเอกสาร (อ้างอิงคำตอบเดิมของ @ Nadeem) และส่งคำขอดึงเพื่อแก้ไข ตอนนี้ข้อมูลนี้สามารถมองเห็นได้ในส่วนการตรวจสอบฝั่งไคลเอ็นต์ของหัวข้อการตรวจสอบโมเดล



2

ฉันประสบปัญหาเดียวกันและไม่มีอะไรได้ผลยกเว้นสิ่งนี้:

$(document).ready(function () { 
    rebindvalidators();
});

function rebindvalidators() {
    var $form = $("#id-of-form");
    $form.unbind();
    $form.data("validator", null);
    $.validator.unobtrusive.parse($form);
    $form.validate($form.data("unobtrusiveValidation").options);
}

และเพิ่ม

// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
    return;

ที่คุณพยายามบันทึกแบบฟอร์ม

ฉันกำลังบันทึกแบบฟอร์มผ่าน Ajax call

หวังว่านี่จะช่วยใครบางคนได้


1
อันนี้ใช้ได้กับฉัน ฉันกำลังหาวิธีแก้ไขจากหลายวันที่ผ่านมามันใช้ได้ผลใน asp.net core 2 ขอบคุณ
Pradip Rupareliya

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