2009-09-15 4 views
3

J'ai un contrôle utilisateur avec des éléments de formulaire qui est considérablement réutilisé dans une grande application Web, et jusqu'à présent le résumé de validation sur une soumission de formulaire non valide est traité par le .aspx qui consomme le contrôle utilisateur.Meilleure façon de définir globalement la propriété ValidationGroup de chaque contrôle dans un asp.net?

Maintenant, j'ai besoin de définir la propriété ValidationGroup à l'exécution pour chacun de mes contrôles d'éléments de formulaire (zones de texte, listes, validateurs, etc). Plutôt que de le faire manuellement en définissant chaque contrôle, je suis intéressé par l'itération à travers tous les contrôles dans le contrôle utilisateur, en détectant si ce contrôle a une propriété ValidationGroup, et en définissant sa valeur de cette façon.

Quelque chose comme ceci:

For Each ctrl As System.Web.UI.Control In Me.Controls 
    ' so now what is the proper way to detect if this control has the ValidationGroup property 
Next 

exemple de code dans vb.net C# fonctionne pour moi. Merci beaucoup!

+0

Je cherchais vraiment un moyen de boucle à travers tous les contrôles et déterminer qui contrôle contenait la propriété ValidationGroup. Après quelques recherches plus approfondies, il semble que Type.GetField() me permette de détecter quels contrôles possèdent la propriété ValidationGroup, mais alors vous devez redéfinir le type approprié, définir la propriété, etc. Je suppose que c'est l'un des les moments où le travail total requis pour mettre en œuvre une approche dynamique l'emporte sur l'approche plus directe/manuelle. J'ai eu environ 35 contrôles et les ai juste placés d'une manière semblable à la suggestion de Rick. –

Répondre

1

Votre UserControl doit exposer une propriété qui définit la propriété ValidationGroup correctement à l'intérieur de lui-même.

contrôle Markup dans .ASPX:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" /> 

contrôle code-behind .ascx:

protected override void OnPreRender(EventArgs e) 
{ 
    someControl.ValidationGroup = YourValidationGroupProp; 
    someControl1.ValidationGroup = YourValidationGroupProp; 
    someControl2.ValidationGroup = YourValidationGroupProp; 
    //......etc 
}  

public string YourValidationGroupProp{ get; set; } 
+0

Rick ce contrôle utilisateur a environ 15 éléments de formulaire différents et environ 10 contrôles de validation différents (~ 25 contrôles qui ont une propriété ValidationGroup).Je suis intéressé à parcourir la collection de contrôles à l'intérieur de l'UC, en détectant s'il a la propriété ValidationGroup et en la définissant ici. Je comprends que je peux contourner chaque contrôle comme vous le suggérez mais cherchait un moyen de le faire en un seul coup. Des pensées à ce sujet? –

+0

S'il s'agit vraiment d'un contrôle réutilisé, il suffit d'implémenter les setters pour ces éléments de formulaire une fois dans le code-behind comme je l'ai indiqué. –

1

Créer un contrôle personnalisé héritant, par exemple, littéral. Ce contrôle sera une aide.

Vous allez l'insérer dans une page, il fera tout le sale boulot pour vous. par exemple. code de sortie [qui prendrait beaucoup de temps à écrire] basé sur une certaine logique et une fois que vous avez terminé avec elle. Obtenez le code automatique (ce qui serait lourd à faire à chaque fois par un autre contrôle), supprimez le contrôle d'assistance et insérez le nouveau code où vous le souhaitez. De cette façon, vous évitez toutes les erreurs en demandant à l'ordinateur de trouver le code que vous voulez et vous obtenez toute la vitesse codée en dur qui pourrait être atteinte en résolvant le problème avec la méthode générique. J'étais juste à la recherche de la même chose et ça m'a tout à coup frappé. J'utilise cette méthode pour d'autres choses [scan tous les contrôles & sortie du code init] mais je suppose que vous pourriez utiliser cette méthode pour le faire aussi bien!

Je viens d'écrire et je vais partager avec vous

public class ValidationCodeProducerHelper : Literal 
{ 
    // you can set this in the aspx/ascx as a control property 
    public string MyValidationGroup { get; set; } 

    // get last minute controls 
    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     // start scanning from page subcontrols 
     ControlCollection _collection = Page.Controls; 
     Text = GetCode(_collection).Replace("\r\n", "<br/>"); 
    } 

    private string GetCode(Control _control) 
    { 
     // building helper 
     StringBuilder _output = new StringBuilder(); 

     // the logic of scanning 
     if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID)) 
     { 
      // the desired code 
      _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup); 
      _output.AppendLine(); 
     } 

     // recursive search within children 
     _output.Append(GetCode(_control.Controls)); 

     // outputting 
     return _output.ToString(); 
    } 

    private string GetCode(ControlCollection _collection) 
    { 
     // building helper 
     StringBuilder _output = new StringBuilder(); 
     foreach (Control _control in _collection) 
     { 
      // get code for each child 
      _output.Append(GetCode(_control)); 
     } 
     // outputting 
     return _output.ToString(); 
    } 
} 
Questions connexes