2009-05-01 13 views
19

Bu soruna daha önce rastladım ama hiçbir zaman tam olarak çözemedim. Birkaç doğrulayıcıya ve aynı zamanda bir CustomValidator'a sahip bir formum var. CustomValidator'ın ValidationSummary ileti kutusuyla çalışmasını sağlayan zarif bir yol

<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" /> 

ve sunucu tarafında

:

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

Benim sorundur: ValidationSummary CustomValidator mesajı göstermez. Bu soru birkaç yerde sorulmuştur, ancak tatmin edici bir cevap görmedim.

cevap

10

Tüm geçerlilik denetleyicilerinizde ve ValidationSummary'da bir ValidationGroup özelliğini kullanmayı deneyin.

DÜZENLEME: "" başka olasılık olabilir Sunucu Doğrulama Kodu

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

yanlış dönen edilirse, bunu doğru yapmakta ve dolayısıyla geçerli kılmaktadır. Bence "!" aşağıdaki gibi:

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

GÜNCELLEME: ValidationSummary bir messagebox içinde özel doğrulayıcı ileti göstermesi için, ClientValidationFunction Kodu olması gerekir. Bir özet olmadan sadece özet görüntülemek gerekirse, bu gerekli değildir.

<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 
    } 

DAHA: Eğer clientside Doğrulama yapmak istemiyorsanız, uyarı göstermek için bu hileyi deneyin. senin CustomValidator ServerValidate yöntemine bu değişikliği yap:

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

Sorunun nerede olduğu konusunda emin değilim. Ancak, bunu deneyeceğim ve rapor edeceğim. –

+0

Bir gözlem yaptıktan sonra yayınımı güncelledim. Lütfen onaylayın. –

+0

Vurgulanan kod aslında tamam. Kullanıcı zaten kayıtlıysa doğrulama başarısız olur. Bu bölüm çalışıyor. Ne olur, '*' metin kutusunun yanında görünür, ancak ValidationSummary bir mesaj kutusu oluşturmaz. –

1

Davandan her doğrulayıcı bir özellik

ValidationGroup="ValidationSummary1"

yazmalı. Sayfanız ShowMessageBox seçenek tamamen istemci tarafı ise

AutoEventWireup="true" 
+0

CustomValidator aslında sunucu tarafı kodunu doğrular ve çalıştırır. Geçersiz olduğunda, metin kutusunun yanındaki metnini ("*") gösterir. Ancak, ValidationSummary diğer iletileri gösterir, ancak CustomValidator'dan değil. –

+0

Sadece bu iki talimatları deneyin ve anlat bana. Çünkü bende kesinlikle aynı durum var ve özel validator'dan gelen mesaj validationsummary – DaDa

+0

'da gösteriliyor. Yanıtınız için teşekkürler DaDa. Belki de ValidationSummary'ın CustomValidator'dan hata göstereceğini açıklığa kavuşturmalıyım. ShowSummary = "true" ayarını yaptım. Sorun, bir mesaj kutusu göstermek istediğimde. –

7

varsa sen CustomValidator üzerinde ClientValidationFunction ayarladıysanız sadece değerlendirecek böylece

de kontrol edin.

Ayrıca, bir uyarı yapan bir komut dosyası kaydederek de hata yapabilirsiniz, bu nedenle sunucunun doğrulamasından geri döndüğünüzde, hata iletisiyle ilgili bilgi verilir. Bu ya (@Jose Basilio başına) ServerValidate yönteminde kaydedilebilir veya sayfadaki tüm geçersiz doğrulayıcıları ile bir pop-up kayıt PreRender olay sırasında aşağıdaki yöntemi çağırabilirsiniz:

/// <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

Teşekkür ÇOK çalışmıyor! ÇALIŞIYOR bir cazibe gibi! –

+0

Tek sorun şu anda, ben özel js işlemek için izin yok. –

5

Yakın zamanda aynı sorunla karşılaştım. ServerValidate belirtilen doğrulama başarısız olduğunda ValidationSummary CustomValidator'dan ErrorMessage göstermiyordu.Varsayılan olarak (benim küçük tersine mühendislik gösterdiğim gibi) doğrulama özeti geri gönderim sırasında istemci tarafında işlendiğinden, yalnızca belge yükü/async geri gönderme tamamlanmasında tüm doğrulayıcıları denetleyen ve başarısız doğrulama grupları için doğrulama özeti oluşturmayı tetikleyen bir komut dosyası ekledim:

$(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(); 
        }); 
} 
); 

Benim senaryoda, ana sayfada kullanıcı denetleyicilerini doğrulama araçları, güncelleştirme paneli ve doğrulama özeti ile iç içe geçirdim.

More details here.

1

Javascript devre dışı bırakıldığında için geçici bir çözüm bulduk ve ValidationSummaryCustomValidator ait errorMessage özelliğini göstermez. Bu, yukarıda açıklandığı gibi, komut dosyası veya uyarıların çalışmadığı için gereklidir.

Yeni bir Doğrulayıcı denetimi ekleyelim, CustomValidatorProxy numaralı telefonu arayarak, ControlToValidate özelliğini formdaki herhangi bir denetime ve EnableClientScript=false olarak ayarlayın. doğrulama yanlış ve benzer ayarlamak hem ErrorMessage özellikleri CustomValidator ve CustomValidatorProxy ait IsValid özelliğini ayarlayın başarısız olursa ServerValidate olay işleyicisi içinde

özel doğrular ve şu.

ServerValidate'daki doğrulama iletilirse, CustomValidatorProxy'un IsValid özelliğinin true değerine ayarlandığından emin olun.

Sayfa ValidatorCollection içinde CustomValidator sonra ServerValidate işleyici CustomValidatorProxyValidationSummary görüntülenir ControlToValidate değeri ve sizin CustomValidator adresinin ErrorMessage valide sahip döndü olacağını IsValid özellik değerini geçersiz kılar önce CustomValidatorProxy olduğunu Sağlanan .

+2

Kodun gösterilmesi durumunda ne yapıyorsunuz daha okunabilir olurdu –

1

bduke's RegisterServerValidationMessageScript "taklit ediyor", ancak değil. Bu gerçekten sorunu giderir. Her Yardımcı Program ad alanının bir yere bu fonksiyona ihtiyacı vardır.