Question

J'ai une fonction qui définit mon linkbutton comme le bouton par défaut pour un panneau.

protected void Page_PreRender(object sender, EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

        string clickScript = String.Format("addClickFunction('{0}');", lbHello.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + lbHello.ClientID, clickScript, true);
    }

Cela fonctionne très bien. Comment faire cette réutilisable pour toutes mes pages de ma demande. Une page peut avoir plusieurs linkbuttons et plusieurs panneaux .... Toute suggestion ...

Était-ce utile?

La solution

La façon la plus propre serait d'utiliser un contrôle serveur personnalisé qui hérite de LinkButton. En fait, cela semble être en ligne avec le blog de votre Walkthrough: développement et utilisation d'un serveur Web contrôle personnalisé. Voici un guide étape par étape pour y parvenir:

  1. ajoutez à votre solution existante un nouveau projet de contrôle serveur ASP.NET (clic droit sur votre solution de la solution Explorer -> Ajouter un nouveau projet -> ASP.NET Control Server). Nom il LinkButtonDefault (vous êtes libre de changer le nom, bien sûr).
  2. Renommer ServerControl1.cs à LinkButtonDefault.cs
  3. Renommer l'espace de noms dans le fichier à CustomControls
  4. Effectuer les étapes 12 à 14 dans l'article MSDN en ouvrant le fichier AssemblyInfo.cs (contenu dans le dossier Properties du projet). Ajoutez cette ligne au bas du fichier: [assembly: TagPrefix("CustomControls", "CC")]
  5. Dans LinkButtonDefault.cs ajouter ce code pour remplacer l'événement OnPreRender:

Code (avis de l'utilisation this.ClientID):

    protected override void OnPreRender(EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
           var b = document.getElementById(id);
           if (b && typeof(b.click) == 'undefined')
             b.click = function() {
               var result = true;
               if (b.onclick) result = b.onclick();
               if (typeof(result) == 'undefined' || result)
                 eval(b.getAttribute('href'));
             }
         };";

        string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

        base.OnPreRender(e);
    }

Vous pouvez également mettre à jour le code d'attribut généré au-dessus de la déclaration de classe qui commence par [ToolboxData("<{0}: à l'utilisation LinkButtonDefault au lieu de ServerControl1. Qu'il est le nouveau projet de contrôle du serveur. Je recommande vivement de lire l'article MSDN ci-dessus pour tirer parti des autres fonctions, telles que l'ajout de contrôles à la boîte à outils si vous avez besoin de le faire.

Après avoir terminé ces étapes, vous devriez avoir un fichier LinkButtonDefault.cs qui ressemble à ceci:

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:LinkButtonDefault runat=server></{0}:LinkButtonDefault>")]
    public class LinkButtonDefault : LinkButton
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }

        protected override void OnPreRender(EventArgs e)
        {
            string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

            string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

            Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

            base.OnPreRender(e);
        }
    }
}

Maintenant, retournez votre application Web et ajouter une référence au projet CustomControls. Vous devriez être en mesure de le faire à partir de l'onglet Project de la Ajouter Référence depuis que je suggère d'ajouter le projet ci-dessus à votre solution existante. Si vous voulez, vous pourriez avoir construit le projet ci-dessus dans sa propre solution, vous ajouteriez une référence à son fichier de .dll en utilisant l'onglet Browse. Une fois une référence a été ajoutée, vous êtes prêt à utiliser le nouveau contrôle LinkButtonDefault.

Pour utiliser les commandes que vous pouvez utiliser la directive @ Inscrivez-vous sur chaque page le contrôle sera utilisé, ou vous pouvez l'ajouter à la web.config et gagner référence facile à elle toute votre application. Je vais vous montrer les deux méthodes ci-dessous. Sur la base de votre question, je pense que vous voulez ajouter à la Web.config. Reportez-vous à l'article MSDN et vous trouverez ainsi des informations de moitié sur la page sous la rubrique « La balise préfixe ».

Utilisation @ Register directive:

Accédez à votre page .aspx et ajoutez les directive Register en haut de chaque page que vous souhaitez utiliser le contrôle:

<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="CC" %>

Sur la même page, vous pouvez maintenant utiliser plusieurs instances du contrôle. Voici un exemple:

<p><strong>1st Panel:</strong></p>
<asp:Label runat="server" ID="helloLabel" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="lbHello">
    First name:
    <asp:TextBox runat="server" ID="txtFirstName" />
    <CC:LinkButtonDefault ID="lbHello" runat="server" Text="Click me" OnClick="lbHello_Click"
        OnClientClick="alert('Hello, World!');" />
</asp:Panel>

<p><strong>2nd Panel:</strong></p>
<asp:Label runat="server" ID="fooBarLabel" />
<asp:Panel ID="Panel2" runat="server" DefaultButton="lbFooBar">
    Other:
    <asp:TextBox runat="server" ID="TextBox1" />
    <CC:LinkButtonDefault ID="lbFooBar" runat="server" Text="Click me" OnClick="lbFooBar_Click" />
</asp:Panel>

Dans le code derrière (.aspx.cs) vous devez ajouter:

protected void Page_Load(object sender, EventArgs e)
{
    // example of adding onClick programmatically
    lbFooBar.Attributes.Add("onClick", "alert('Foo Bar!');"); 
}

protected void lbHello_Click(object sender, EventArgs e)
{
    helloLabel.Text = String.Format("Hello, {0}", txtFirstName.Text);
}

protected void lbFooBar_Click(object sender, EventArgs e)
{
    fooBarLabel.Text = String.Format("FooBar: {0}", TextBox1.Text);
}

Utilisation Web.config:

Pour utiliser le Web.config conserver le même balisage et le code exact utilisé dans l'exemple ci-dessus. Procédez comme suit:

  1. Supprimer la directive @ Register utilisé sur le balisage .aspx.
  2. Ouvrez le fichier Web.config pour votre application Web.
  3. Recherchez la section <system.web>...</system.web>.
  4. Ajoutez le mappage suivant à cette section:

Cartographie:

<pages>
  <controls>
    <add assembly="CustomControls" namespace="CustomControls" tagPrefix="CC" />
  </controls>
</pages>

recompilation et tout devrait construire avec succès. Avec cela en place, vous ne avez plus besoin de préciser la directive @ Register sur chaque page.

Si vous êtes coincé et avez des questions me le faire savoir. Il suffit de lire sur tout ce qui précède attentivement, car il est un long message avec beaucoup de code.

Autres conseils

Vous pouvez créer une classe (le call let il Foo) qui dérive de System.Web.UI.Page et abstraite méthode à un point où il est réutilisable. Tous vos ContentPages devraient provenir de Foo au lieu de System.Web.UI.Page

Ma recommandation serait soit d'utiliser une page maître, ou briser le code en dehors d'une fonction statique qui prend un objet System.Web.UI.Page en tant que paramètre. Bien sûr, vous pouvez toujours utiliser l'héritage (qui fonctionne), mais vous perdrez la possibilité de mise en page votre page en utilisant la fonctionnalité de temps de conception glisser-déposer, puisque le formulaire Web de VS.NET concepteur fait un grand Freakout avec des pages ASPX que ne proviennent pas de System.Web.UI.Page ou System.Web.UI.MasterPage directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top