2009-10-29 27 views
14

Tôi đang cố vô hiệu hoá trình xác thực bằng cách sử dụng jquery.vô hiệu hóa trình xác thực asp.net bằng cách sử dụng jquery

Tôi đã xem Disable ASP.NET validators with JavaScript và một vài người khác cũng làm như vậy.

Có vẻ như ot đang hoạt động nhưng bị phá vỡ.

Mã của tôi:

$('.c_MyValdiators').each(function() { 

    var x = $(this).attr('id'); 
    var y = document.getElementById(x); 
    ValidatorEnable(y[0], false); 
}); 

tôi nhận được Lỗi: val là undefined [Phá vỡ về lỗi này] val.enabled = (enable = sai!); \ R \ n

Hoặc nếu tôi sử dụng

$('.c_MyValdiators').each(function() { 
    ValidatorEnable($(this), false); OR ValidatorEnable($(this[0]), false); 
    }); 

Tôi gặp lỗi:

val.style không được xác định [Chia nhỏ lỗi này] val.style.visibility = val.isvalid? "ẩn": "hiển thị"; \ r \ n

Bất kỳ ý tưởng hoặc đề xuất nào?

+1

Như một mẹo troublehooting cơ bản, trước tiên bạn có thể muốn xem những gì đang được truyền cho chức năng của bạn. Những gì x hoặc y trở lại? –

Trả lời

6

Tôi tin rằng ValidatorEnable lấy ID ASP.net thay vì ClientID được sản xuất bởi ASP.net. Bạn cũng sẽ cần phải thực hiện xác nhận có điều kiện trong CodeBehind.

đây là ví dụ:

Cách sử dụng cụ thể là có thể bật hoặc tắt trình xác thực. Nếu bạn có xác nhận rằng bạn muốn hoạt động chỉ trong các tình huống nhất định, bạn có thể cần phải thay đổi kích hoạt trên cả máy chủ và máy khách, hoặc bạn sẽ thấy rằng người dùng không thể gửi trang.

Dưới đây là ví dụ trước đó với một lĩnh vực mà sẽ chỉ được xác nhận khi một hộp chọn được đánh dấu:

public class Conditional : Page { 
    public HtmlInputCheckBox chkSameAs; 
    public RequiredFieldValidator rfvalShipAddress; 
    public override void Validate() { 
     bool enableShip = !chkSameAs.Checked; 
     rfvalShipAddress.Enabled = enableShip; 
     base.Validate(); 
    } 
} 

Dưới đây là client-side tương đương:

<input type=checkbox runat=server id=chkSameAs 
    onclick="OnChangeSameAs();" >Same as Billing<br> 
<script language=javascript> 
function OnChangeSameAs() { 
    var enableShip = !event.srcElement.status; 
    ValidatorEnable(rfvalShipAddress, enableShip); 
} 
</script> 

tham khảo: http://msdn.microsoft.com/en-us/library/aa479045.aspx

+2

Cảm ơn bạn đã trả lời. Liên kết MSDN là tốt để tham khảo trong tương lai. Tôi không có bất kỳ xác nhận() để ghi đè kể từ khi tôi m trong tập tin ascx. Tôi chỉ làm cho nó hoạt động sau rất nhiều lần thử sử dụng: ValidatorEnable (document.getElementById ($ (this).attr ('id')), true); Có một vấn đề nữa, Vì điều này chỉ cho phép/vô hiệu hóa ở phía máy khách, làm cách nào để vô hiệu hóa trình xác thực của tôi vì chúng bị vô hiệu khi trang đăng lại? bất kỳ ý tưởng nào? – LibraRocks

+0

bạn có thể muốn chỉ cần tạo một CustomValidator với một kịch bản khách hàng tùy chỉnh kiểm tra dựa trên một điều kiện. Liên kết tôi đã đăng ở trên cho thấy cách thực hiện điều này –

2
ValidatorEnable(document.getElementById($(this).attr('id')), true); 
6

Tôi vừa vấp vào Câu hỏi của bạn [một năm sau]. Tôi cũng muốn vô hiệu hóa tất cả các trình duyệt tính hợp lệ trên một trang bằng cách sử dụng JQuery ở đây là cách tôi xử lý nó.

$('span[evaluationfunction]').each(function(){ValidatorEnable(this,false);}); 

Tôi tìm từng khoảng thời gian trên trang có thuộc tính evaluationfunction rồi gọi ValidatorEnabled cho mỗi một trong số chúng.

Tôi nghĩ rằng phần $ ('này') của mã của bạn là nguyên nhân gây ra hickup.

0

Hàm ValidatorEnable lấy đối tượng làm thông số thứ nhất và không phải là một chuỗi của id của đối tượng.

0

Đây là cách đơn giản để xử lý việc này.

Thêm lớp mới vào kiểm soát Xác thực.

Sau đó, tìm lớp đó bằng jquery và tắt điều khiển.

Ví dụ:

if (storageOnly == 1) 
    { 
     $('#tblAssignment tr.assdetails').addClass('hidden'); 

     $('span[evaluationfunction]').each(function() 
     { 
      if ($(this).hasClass('assdetail')) 
      { ValidatorEnable(this, false); } 
     }); 
    } 
    else 
    { 
     $('#tblAssignment tr.assdetails').removeClass('hidden'); 
    } 

* trình như một say mê. ** Dành cho bạn các loại trí tưởng tượng, chi tiết chuyển nhượng ass = chi tiết ==.

đây tùy thuộc vào điều kiện if, tôi hoặc ẩn các hàng sau đó vô hiệu hóa các validator, hoặc loại bỏ các lớp ẩn từ các hàng ..

1

Tôi chỉ chạy vào cùng một vấn đề, nhờ vào các câu trả lời khác , vì nó giúp phát hiện ra vấn đề, nhưng họ đã không đi vào chi tiết tại sao.

Tôi tin rằng đó là do ValidatorEnable() mong đợi một đối tượng DOM (tức là đối tượng kiểm soát xác thực) phản đối một ID.

$ (selector) .each() thiết lập "này" để các phần tử DOM được hiện lặp qua tức là trích dẫn từ tài liệu jquery:

"More importantly, the callback is fired in the context of the current DOM element, so the keyword this refers to the element." - http://api.jquery.com/each/

Vì vậy, bạn không cần làm: document.getElementById($(this).attr('id')

Và thay vào đó, ValidatorEnable(this, true); là tốt.

Điều thú vị là câu trả lời của Russ cũng đề cập đến việc vô hiệu xác thực phía máy chủ, điều này có ý nghĩa - nhưng tôi không cần phải làm điều này (điều này có liên quan!).

Phết nhận xét trước đó của tôi, đó là vì tôi đã bị vô hiệu hóa phía máy chủ bị vô hiệu hóa trước đó.

2

Tôi có một giải pháp khác, đó là sử dụng thuộc tính 'đã bật' của thẻ span cho trình xác thực. Tôi có các div khác nhau trên một biểu mẫu sẽ hiển thị hoặc ẩn nên tôi cần vô hiệu hóa xác thực cho các trường bên trong div ẩn. Giải pháp này tắt tính năng xác thực mà không cần kích hoạt chúng.

Nếu bạn có một bộ điều khiển RequiredFieldValidator rằng tất cả đều chứa một chuỗi phổ biến mà bạn có thể sử dụng để lấy họ jquery là thế này:

$("[id*='CommonString']").each(function() { 
    this.enabled = false; // Disable Validation 
}); 

or 

$("[id*='CommonString']").each(function() { 
    this.enabled = true; // Enable Validation 
}); 

Hope this helps.

John

Các vấn đề liên quan