8

Tôi gặp sự cố khi xác thực hộp thoại Giao diện người dùng jQuery bằng cách sử dụng Jquery Validate khi nhấp vào Lưu.Hộp thoại giao diện người dùng jQuery + Xác thực

Đây là mã của tôi để tạo hộp thoại Jquery. Nó tải hộp thoại từ một mục tiêu URL href:

$(document).ready(dialogForms); 

function dialogForms() { 
    $('a.dialog-form').click(function() { 
    var a = $(this); 
    $.get(a.attr('href'),function(resp){ 
     var dialog = $('<div>').attr('id','formDialog').html($(resp).find('form:first').parent('div').html()); 
     $('body').append(dialog); 
     dialog.find(':submit').hide(); 
     dialog.find('#return').hide(); 
     dialog.dialog({ 
     title: a.attr('title') ? a.attr('title') : '', 
     modal: true, 
     buttons: { 
      'Save': function() {submitFormWithAjax($(this).find('form'));}, 
      'Cancel': function() {$(this).dialog('close');} 
     }, 
     close: function() {$(this).remove();}, 
     width: 'auto' 
     }); 
    }, 'html'); 
    return false; 
    }); 
} 

function submitFormWithAjax(form) { 
    form = $(form); 
    $.ajax({ 
     beforeSend: function(data) { 
      //alert("beforesend"); 
      form.validate(); 
     }, 
     url: form.attr('action'), 
     data: form.serialize(), 
     type: (form.attr('method')), 
     dataType: 'text', 
     error: function(data) { 
      alert(data); 
      $('#result').html(data); 
     }, 
     success: function(data) { 
      //alert("success"); 
      $('#result').html(data); 
      setTimeout("reloadPage()", 500); 
     } 
    }); 
    return false; 
} 

Các beforeSend được gọi, nhưng nó dường như không gọi phương thức validate, được đặt trên trang mẹ từ đó được gọi là Dialog.

 $(document).ready(function() { 
      $("#event_form").validate({ 
       rules: { 
        Name: { 
         required: true 
        }, 
        Category: { 
         required: true 
        } 
       }, 
       messages: { 
        Name: "Please enter an event name", 
        Category: "Please choose a category" 
       }, 
       submitHandler: function(form) { 
        alert("validated"); 
        //     $('#loading_1').show(); 
        //     $('#proceed_c').hide(); 
        //     $(form).ajaxSubmit(); 
        //     //form.submit(); 
       }, 
       errorPlacement: function(error, element) { 
        error.appendTo(element.next(".status")); 
       } 
      }); 

} 

là vấn đề với beforeSend trong submitFormWithAjax function, vị trí của $("#event_form").validate hoặc submitHandler: function(form) bên trong nó? Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

+0

Bạn có thể cho rằng lớp '.error' đang được thêm vào các yếu tố của bạn khi họ đang không hợp lệ? –

Trả lời

7

Khi bạn khởi tạo hộp thoại jQueryUI, nó sửa đổi DOM, toàn bộ hộp thoại được lấy ra khỏi vị trí của nó trong trang và được chèn ngay trước thẻ </body>. Bạn có thể thấy điều này với Firebug. Điều này gây ra một vấn đề để xác nhận, bởi vì bây giờ biểu mẫu trống. Để giải quyết vấn đề này, trên sự kiện mở của hộp thoại, hãy thêm nó vào biểu mẫu. Nghe có vẻ thực sự lập dị, nhưng tôi tin tưởng, nó hoạt động :)

dialog.dialog({ 
    title: a.attr('title') ? a.attr('title') : '', 
    modal: true, 
    buttons: { 
     'Save': function() {submitFormWithAjax($(this).find('form'));}, 
     'Cancel': function() {$(this).dialog('close');} 
    }, 
    close: function() {$(this).remove();}, 
    open: function(){ 
     $(this).parent().appendTo($('#event_form')); 
    }, 
    width: 'auto' 
    }); 

Edit:

<form id='event_form'> 
    <div id="dialog" title="DialogTitle"> 
    </div> 
</form> 
+0

Tôi đã thử điều này và nó không hoạt động. Hộp thoại hiện không hiển thị. Chỉ cần làm rõ, trang gọi hộp thoại jquery và giữ hàm dialogForms() (trang gọi) không chứa bất kỳ phần tử biểu mẫu nào. Trang đích chứa một event_form và tập lệnh xác thực jquery. Đây có phải là địa điểm phù hợp với họ không? Là appendTo vẫn nhắm mục tiêu event_form? – Dean

+1

Tôi đã chỉnh sửa câu trả lời để thêm cấu trúc tôi sử dụng, hộp thoại được áp dụng cho div và xác thực biểu mẫu. Hộp thoại được nối lại vào biểu mẫu. Tất cả điều này, bao gồm mã jquery nằm trong một tệp riêng biệt và được nạp vào div emty trên trang của tôi trên sự kiện onclick(). –

+0

nó hoạt động !! cảm ơn rất nhiều;) – frabiacca

2

Took một cách tiếp cận hơi khác nhau này. Tôi cần thiết để tái sử dụng hình thức modal của tôi vì vậy tôi thêm một lần jquery "tạo ra" những phương thức:

$("#mdl_Subject").dialog({ 
    autoOpen: false, 
    show: "drop", 
    hide: "drop", 
    modal: true, 
    create: function() { 
     $(this).parent().appendTo($('#aspnetForm')); 
    } 
}); 
+0

Đã gửi cùng một sửa đổi phương thức để sử dụng tùy chọn appendTo như được đề xuất tại đây: http://bugs.jqueryui.com/ticket/9095. Tôi nghĩ rằng chỉ có phiên bản jquery ui mới hơn (> = 1.10.2) bị ảnh hưởng. – wtjones