2012-03-07 25 views
6

Chúng tôi thường gặp sự cố với trình xác thực .NET trên các phần tử được ẩn bằng javascript/css (ví dụ: display: none)Bỏ qua trình xác thực .NET nếu phần tử bị ẩn (hiển thị: không)

Ví dụ (có thể có lỗi cú pháp, nhưng đừng lo lắng về điều đó)

<asp:CheckBox ID="chkNewsletter" runat="server" Checked="true" /> 
... 
<div id='newsletterOnly'> 
    <asp:TextBox ID="txtEmail" runat="server" /> 
    <asp:RequiredFieldValidator ID="vldEmail" ControlToValidate="txtEmail" ErrorMessage="Required" runat="server" /> 
</div> 

với JavaScript:

$('#chkNewsletter').changed(function() { 
    $(this).is(':checked') ? $('#newsletterOnly').show() : $('#newsletterOnly').hide(); 
}); 

nó không nên xác nhận txtEmail nếu nó bị ẩn.
Bạn không thể gửi biểu mẫu nếu newsletterOnly là ẩn, vì RequiredFieldValidator vẫn còn hiệu quả eventhough nó được ẩn :(
Và thậm chí bạn không thể nhìn thấy thông báo lỗi validator bởi vì nó được ẩn

Liệu có cách nào để khắc phục điều này?

tôi cố gắng để tránh PostBacks cải thiện trải nghiệm người dùng.
tôi ước gì tôi có thể sửa đổi NET javascript để xác nhận điều khiển chỉ khi họ có thể nhìn thấy.

+0

Bạn đã thử tắt các thành phần ẩn chưa? Tôi muốn _expect_ đó là giải pháp. –

+0

Điều gì về khả năng sử dụng hai mô hình chế độ xem khác nhau khi đăng lên máy chủ: một cho mỗi tình huống khác nhau? Bạn chỉ cần đăng lên hai tuyến đường khác nhau. – Eli

+0

Hoặc bạn sẽ cần thực hiện xác thực trong javascript, thay vì trên máy chủ. – arcynum

Trả lời

9

tôi đã viết này như một giải pháp chung (có thể được sử dụng trên tất cả các trang web .NET).

Bạn chỉ cần thêm nút OnClientClick vào nút gửi.

//=================================================================== 
// Disable .NET validators for hidden elements. Returns whether Page is now valid. 
// Usage: 
// <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 
//=================================================================== 
function DisableHiddenValidators() { 
    for (var i = 0; i < Page_Validators.length; i++) { 
    var visible = $('#' + Page_Validators[i].controltovalidate).is(':visible'); 
    ValidatorEnable(Page_Validators[i], visible) 
    } 
    return Page_ClientValidate(); 
} 

Để sử dụng nó, chỉ cần bao gồm trên javascript và thêm lớp OnClientClick="DisableHiddenValidators()" vào nút gửi:

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 

EDIT: jQuery $(submitButton).click chức năng đã không làm việc trên iPhone/Android. Tôi đã thay đổi mã mẫu ở trên một chút.

Nếu bất cứ ai nhìn thấy bất cứ điều gì cải thiện sai hoặc có thể xin vui lòng bình luận :)

+0

Trừ khi tôi đang làm gì đó sai. Điều này sẽ vô hiệu hóa tất cả các trình duyệt tính hợp lệ trên trang. Ngay cả những người có thể nhìn thấy? – Obsidian

+0

Nó không nên. Biến hiển thị có được đặt chính xác cho bạn không? – Aximili

0

Nó cũng có thể là một ý tưởng tốt để sử dụng Validation nhóm trong một tình huống như thế này. Nếu bạn có thể nhóm các trình duyệt tính hợp lệ của bạn, sau đó xác định trên Nút mà nhóm xác thực mà bạn cần xác thực, chỉ những người xác nhận hợp lệ trong nhóm mới được xác nhận hợp lệ. Đọc thêm tại đây: http://msdn.microsoft.com/en-us/library/vstudio/ms227424(v=vs.100).aspx

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