2009-05-01 22 views
19

Tôi đã gặp phải vấn đề này trước đây nhưng chưa bao giờ giải quyết được nó. Tôi có một biểu mẫu với một vài trình xác nhận hợp lệ và cũng là một CustomValidator.Cách thanh lịch để làm cho CustomValidator hoạt động với hộp thoại ValidationSummary

<asp:Label ID="lblMemberNum" runat="server" Text="Membership #:" CssClass="LabelMedium" ></asp:Label> 
<asp:TextBox ID="txtMemberNum" runat="server" CssClass="TextBox" ></asp:TextBox> 
<asp:RequiredFieldValidator ID="rfvMemberNum" SetFocusOnError="True" runat="server" 
    ControlToValidate="txtMemberNum" ErrorMessage="[ Membership # ] is required" 
    CssClass="ValidationMessage" Display="Dynamic" >*</asp:RequiredFieldValidator> 
<asp:RegularExpressionValidator ID="revMemberNum" Display="Dynamic" runat="server" 
    ControlToValidate="txtMemberNum" CssClass="ValidationMessage" 
    ErrorMessage="[ Membership # ] can only contain letters" 
    ValidationExpression="^([a-zA-Z\d]+)$" >*</asp:RegularExpressionValidator> 
<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic" 
    ControlToValidate="txtMemberNum" ValidateEmptyText="false" 
    OnServerValidate="cvMemberNum_Validate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator> 

<asp:ValidationSummary ID="ValidationSummary1" runat="server" 
    CssClass="ValidationMessage" 
    ShowMessageBox="True" ShowSummary="False" /> 

và ở phía máy chủ:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) 
{ 
    try 
    { 
     args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 
    } 
    catch 
    { 
     args.IsValid = false; 
    } 
} 

Vấn đề của tôi là: ValidationSummary không bao giờ hiển thị thông báo từ CustomValidator. Câu hỏi này đã được hỏi ở nhiều nơi, nhưng tôi đã không thấy câu trả lời thỏa đáng.

Trả lời

10

Hãy thử sử dụng thuộc tính Nhóm hợp lệ trên tất cả các trình xác thực của bạn và ValidationSummary.

EDIT: "!" Một khả năng khác có thể là Server Validation Mã

args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 

nếu đang trở lại sai sự thật, là làm cho nó đúng và do đó làm cho nó hợp lệ. Tôi nghĩ bạn nên thoát khỏi "!" như sau:

args.IsValid = CampaignRegistration.IsMemberRegistered(args.Value); 

UPDATE: Để cho ValidationSummary hiển thị thông điệp validator tùy chỉnh của bạn trong một bảng thông báo, bạn cần phải có ClientValidationFunction Mã. Nếu bạn chỉ cần hiển thị bản tóm tắt mà không có cửa sổ bật lên thì điều này là không cần thiết.

<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic" 
    ControlToValidate="txtMemberNum" ValidateEmptyText="false" 
    OnServerValidate="cvMemberNum_Validate" 
    ClientValidationFunction = "ClientValidate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator> 
    //JavaScript Code. 
    function ClientValidate(source, args) 
    {   
     args.IsValid = false; //you need to add validation logic here 
    } 

THÊM: Nếu bạn không muốn làm clientside Validation, hãy thử mẹo này để hiển thị cảnh báo. Thực hiện thay đổi này để phương pháp ServerValidate CustomValidator của bạn:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) 
{ 
    bool isValid = true; 
    try 
    { 
     isValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 
    } 
    catch 
    { 
     isValid = false; 
    } 
    args.IsValid = isValid; 

    if(!isValid) 
    { 
     if(!Page.IsClientScriptBlockRegistered("CustomValidation")) 
     Page.RegisterClientScriptBlock("CustomValidation", "<script>alert('This membership number is already registered');</script>"); 

    } 

} 
+0

Tôi khá chắc chắn đó không phải là vấn đề. Tuy nhiên, tôi sẽ cố gắng và báo cáo lại. –

+0

Tôi đã cập nhật bài đăng của mình sau khi quan sát. Vui lòng xác nhận. –

+0

Mã bạn đánh dấu thực sự là ok. Xác thực không thành công nếu người dùng đã đăng ký. Phần đó hoạt động. Điều gì xảy ra là, '*' xuất hiện bên cạnh hộp văn bản, nhưng ValidationSummary không hiển thị một hộp thông báo. –

1

Bạn nên viết một tài sản

ValidationGroup="ValidationSummary1"

ở mọi validator trong trường hợp của bạn.

Ngoài ra kiểm tra nếu trang của bạn có

AutoEventWireup="true" 
+0

CustomValidator thực sự xác nhận và thực thi mã phía máy chủ. Khi không hợp lệ, nó sẽ hiển thị văn bản của nó ("*") bên cạnh hộp văn bản. Tuy nhiên, ValidationSummary hiển thị các thông báo khác nhưng không hiển thị từ CustomValidator. –

+0

Chỉ cần thử hai hướng dẫn này và cho tôi biết. Bởi vì tôi hoàn toàn giống như vậy và thông báo từ trình xác thực tùy chỉnh hiển thị trong validationsummary – DaDa

+0

Cảm ơn bạn đã phản hồi DaDa. Có lẽ tôi nên làm rõ rằng ValidationSummary cho thấy lỗi từ CustomValidator IF tôi đặt ShowSummary = "true". Vấn đề là khi tôi muốn hiển thị một hộp thư. –

7

Tùy chọn ShowMessageBox là hoàn toàn phía máy khách, vì thế nó sẽ chỉ đánh giá nếu bạn đã thiết lập các ClientValidationFunction trên CustomValidator.

Bạn cũng có thể giả mạo nó bằng cách đăng ký tập lệnh tạo cảnh báo, vì vậy khi bạn quay lại từ xác thực của máy chủ, nó sẽ nhắc nhở với thông báo lỗi. Đây một trong hai có thể được đăng ký trong phương pháp ServerValidate (mỗi @Jose Basilio), hoặc bạn có thể gọi phương thức sau đây trong sự kiện PreRender để đăng ký một popup với tất cả các xác nhận hợp lệ trên trang:

/// <summary> 
    /// Registers a script to display error messages from server-side validation as the specified <see cref="UserControl"/> or <see cref="Page"/> loads from a postback. 
    /// </summary> 
    /// <remarks> 
    /// Must be called in the PreRender if used to validate against the Text property of DNNTextEditor controls, otherwise Text will not be populated. 
    /// Must set the ErrorMessage manually if using a resourcekey, otherwise the resourcekey will not have overridden the ErrorMessage property. 
    /// </remarks> 
    /// <param name="ctrl">The <see cref="UserControl"/> or <see cref="Page"/> which is being posted back.</param> 
    /// <param name="validationGroup">The validation group against which to validate.</param> 
    public static void RegisterServerValidationMessageScript(TemplateControl ctrl, string validationGroup) 
    { 
     if (ctrl != null && ctrl.Page.IsPostBack) 
     { 
      ctrl.Page.Validate(validationGroup); 
      if (!ctrl.Page.IsValid) 
      { 
       StringBuilder errorMessage = new StringBuilder("<script language='javascript'>alert('"); 
       for (int i = 0; i < ctrl.Page.Validators.Count; i++) 
       { 
        IValidator validator = ctrl.Page.Validators[i]; 
        if (!validator.IsValid) 
        { 
         errorMessage.Append("- " + validator.ErrorMessage); 
         if (i < ctrl.Page.Validators.Count - 1) 
         { 
          errorMessage.Append(@"\r\n"); 
         } 
        } 
       } 

       errorMessage.Append("');</script>"); 
       ctrl.Page.ClientScript.RegisterStartupScript(typeof(IValidator), "validationAlert", errorMessage.ToString(), false); 
      } 
     } 
    } 
+0

Cảm ơn rất nhiều! Làm việc như một say mê! –

+0

chỉ có vấn đề là tại thời điểm này, tôi không được phép hiển thị js tùy chỉnh. –

1

này đã làm việc cho tôi:

<asp:CustomValidator runat="server" ID="cv" 
ClientValidationFunction="ValidateFunction" 
ErrorMessage="Default error 
message">*</asp:CustomValidator> 

<script type="text/javascript"> 
function ValidateFunction(sender, args) 
{ 

var msg =''; 
var formValid = true; 

[various checks setting msg and formValid] 

if (msg.length > 0) { sender.errormessage = msg; } 
args.IsValid = formValid; 

} 
</script> 
5

Gần đây tôi đã gặp sự cố tương tự. ValidationSummary không hiển thị ErrorMessage từ CustomValidator khi ServerValidate tuyên bố lỗi xác thực.Vì theo mặc định (như kỹ thuật đảo ngược nhỏ của tôi đã hiển thị), tôi đã thêm một script để kiểm tra tất cả các trình xác nhận hợp lệ trên tải tài liệu/hoàn thành postback không đồng bộ và kích hoạt tạo bản tóm tắt xác nhận cho các nhóm xác nhận không thành công:

$(document).ready(function() { 
    var displayAlert = function() { 
     if (typeof Page_Validators == 'undefined') return; 

     var groups = []; 
     for (i = 0; i < Page_Validators.length; i++) 
      if (!Page_Validators[i].isvalid) { 
       if (!groups[Page_Validators[i].validationGroup]) { 
        ValidationSummaryOnSubmit(Page_Validators[i].validationGroup); 
        groups[Page_Validators[i].validationGroup] = true; 
       } 
      } 
    }; 

    displayAlert(); 

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
        function() { 
         displayAlert(); 
        }); 
} 
); 

Trong trường hợp của tôi, tôi đã kiểm soát người dùng lồng nhau với trình xác thực, bảng cập nhật và tóm tắt xác thực tại trang chính.

More details here.

1

Tôi đã tìm thấy một workaround cho khi javascript bị vô hiệu hóa và ValidationSummary không hiển thị errorMessage tài sản của CustomValidator. Điều này là bắt buộc khi chèn tập lệnh hoặc cảnh báo, như được mô tả ở trên, sẽ không hoạt động.

Thêm điều khiển Trình xác thực mới, hãy gọi số CustomValidatorProxy, đặt thuộc tính ControlToValidate cho bất kỳ điều khiển nào trong biểu mẫu và EnableClientScript=false.

Trong handler ServerValidate kiện thực hiện xác nhận tùy chỉnh của bạn và nếu xác nhận thất bại thiết lập IsValid tài sản của CustomValidatorCustomValidatorProxy false và thiết lập tương tự như cả ErrorMessage tài sản.

Nếu xác thực trong ServerValidate được chuyển, hãy đảm bảo rằng thuộc tính IsValid của CustomValidatorProxy được đặt thành true.

Cung cấp các CustomValidatorProxy là trước khi CustomValidator trong ValidatorCollection của trang sau đó xử lý ServerValidate sẽ ghi đè giá trị IsValid tài sản mà CustomValidatorProxy sẽ trở lại sau khi được xác nhận giá trị ControlToValidateErrorMessage của bạn từ CustomValidator của bạn sẽ được hiển thị trong ValidationSummary .

+2

Điều bạn đang làm sẽ dễ đọc hơn nếu mã được hiển thị –

1

bduke's RegisterServerValidationMessageScript là "giả mạo", nhưng không phải. Nó thực sự khắc phục vấn đề. Mỗi không gian tên tiện ích cần chức năng này ở đâu đó.

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