Le meilleur moyen de définir globalement la propriété ValidationGroup de chaque contrôle dans un asp.net?

StackOverflow https://stackoverflow.com/questions/1424577

  •  07-07-2019
  •  | 
  •  

Question

J'ai un contrôle utilisateur contenant des éléments de formulaire qui est considérablement réutilisé dans une application Web volumineuse. Jusqu'à présent, le résumé de validation relatif à une soumission de formulaire non valide est traité par le .aspx qui utilise le contrôle utilisateur.

Je dois maintenant définir la propriété ValidationGroup au moment de 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 une itération de tous les contrôles du contrôle utilisateur, en détectant si ce contrôle a une propriété ValidationGroup et en définissant sa valeur de cette manière.

Quelque chose comme ça:

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

L'échantillon de code dans vb.net ou c # fonctionne pour moi. Merci beaucoup!

Était-ce utile?

La solution

Votre contrôle utilisateur doit exposer une propriété définissant correctement la propriété ValidationGroup à l'intérieur de celle-ci.

Balisage de contrôle dans .ASPX:

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

Le code de contrôle derrière le fichier .ASCX:

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

 public string YourValidationGroupProp{ get; set; }

Autres conseils

Créez un contrôle personnalisé héritant, par exemple, littéral. Ce contrôle sera un assistant.

Vous l'insérerez dans une page et le ferez faire tout le sale boulot pour vous. par exemple. code de sortie [qui prendrait beaucoup de temps à écrire] basé sur une logique et une fois que vous avez terminé.

Obtenez ce code automatique (ce qui aurait du poids de le faire à chaque fois par un autre contrôle), supprimez le contrôle auxiliaire et placez le nouveau code de manière irréversible 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 gagnez toute la vitesse codée en dur qui souffrirait en résolvant le problème avec la méthode générique.

J'étais justement à la recherche de la même chose et cela m'a soudainement frappé. J'utilise cette méthode pour autre chose [scanner tous les contrôles & amp; sortie du code init]] mais je suppose que vous pourriez utiliser cette méthode pour le faire facilement aussi!

Je viens de l'écrire et je vais le 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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top