2012-06-16 35 views
9

Tôi có mảnh sau asp:CustomValidator không hoạt động tốt

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup"/> 

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label> 
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox> 
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
     ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server" 
     CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup"> 
    *</asp:RegularExpressionValidator> 
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup" OnServerValidate="UserValidate">*</asp:CustomValidator> 

Và sau đó các chức năng:

protected void UserValidate(object source, ServerValidateEventArgs args) 
    { 
     SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'"; 
     DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty); 
     if (dv.Table.Rows.Count != 0) 
      args.IsValid = false; 
     else 
      args.IsValid = true; 
    } 

Button:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
     ValidationGroup="RegisterUserValidationGroup" 
     onclick="CreateUserButton_Click"/> 

Sự cố là mặc dù chức năng trình xác thực tùy chỉnh được gọi và đặt .IsValid thành false, logic nút vẫn chạy!

+0

Tôi không chắc liệu nó có đáng giá hay không, nhưng tôi cũng đã cố gắng đặt NoUserValidator.IsValid = false – RanH

+0

Tôi không thấy nút trong đánh dấu của bạn nhưng chắc chắn rằng nó có nhóm ValidationGroup được đặt thành RegisterUserValidationGroup của bạn. – Gloopy

+0

Tôi đã thêm mã nút vào msg – RanH

Trả lời

11

Trong chức năng onclick của bạn cho nút, thêm một tấm séc để xem nếu trang có giá trị

protected void CreateUserButton_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     // Create the user 
    } 
} 

Điều đó sẽ làm điều đó. Điều này là do trình xác thực tùy chỉnh của bạn được thiết lập để xác thực trên máy chủ, trong quá trình đăng lại. Điều gì xảy ra là mã đầu tiên chạy mã validator UserValidate, nơi bạn đặt cờ IsValid. Tiếp theo trong ngăn xếp postback là chức năng onclick của nút. Hàm này sẽ chạy bất kể kết quả trong hàm validator, vì vậy đây là nơi bạn cần kiểm tra giá trị của cờ IsValid. Đây là hành vi khi bạn xác thực kiểm soát xác thực tùy chỉnh ở phía máy chủ.

Cách khác là xác thực ở phía máy khách. Nếu bạn xem mã nguồn trang được tạo bởi trình duyệt của mình, bạn sẽ thấy Javascript được thêm cho số RegularExpressionValidator. Hành vi của nó được biết đến và được xử lý ở phía máy khách, do đó không cần đăng lại để đánh giá biểu thức và xác thực trang (tất cả đều được xử lý bởi javascript). Không xác định được hàm xác thực tùy chỉnh, do đó, bạn cần phải đăng lại trừ khi bạn tự xác định kịch bản xác thực phía máy khách.

Đây là liên kết để biết thêm thông tin về MSDN.

+1

Cảm ơn nó đã sửa nó, bạn có thể giải thích lý do tại sao nó hoạt động tốt với các trình duyệt tính hợp lệ khác, và cho tùy chỉnh tôi phải thêm những gì bạn đã viết? – RanH

+1

Thực ra, tôi không chắc chắn, vì vậy tôi sẽ đoán, nhưng tôi nghĩ rằng đó là bởi vì các trình xác nhận hợp lệ khác đang xác thực trên phía máy khách, trong khi trình xác thực tùy chỉnh đang xác nhận hợp lệ phía máy chủ. Vì đó là phía máy chủ, việc đăng lại đã bắt đầu và bạn đang thực thi trình xác thực tùy chỉnh đầu tiên của mình, sau đó nhấp vào chức năng nhấp của nút. Điều đó có ý nghĩa? –

+0

Cách bạn mô tả nó có ý nghĩa, nhưng tôi hy vọng trang sẽ chờ tất cả các phê chuẩn duyệt trước khi tiếp tục, và bên cạnh tất cả những người khác cũng được cấu hình để runat = server, nhưng có lẽ điều đó không quan trọng trên chúng? – RanH

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