2009-12-21 6 views
1

J'ai une application WebForms qui fonctionnait principalement sur les publications. Mais maintenant, j'aimerais utiliser jQuery de plus en plus, et je préférerais contrôler le ClientID pour avoir un vrai sélecteur "#id" au lieu d'utiliser "input [id $ = myID]".Formulaires Web ASP.net, Méthodes de contrôle de l'ID client

Maintenant, comme j'aime toujours utiliser ASP.net Controls (j'ai besoin de travailler avec eux via CodeBehind), je me demande s'il existe de bonnes alternatives?

L'application en question s'exécute sur SharePoint 2007 et 2010, ce qui signifie a) aucun moyen de basculer vers ASP.net MVC et b) aucun code en ligne dans le fichier .ASPX, ce qui signifie également aucun moyen de générer dynamiquement le JavaScript en utilisant $("<%= MyControl.ClientID %>). (Oui, je sais que je peux activer Inline Code dans le web.config, mais je veux éviter cela)

Une approche en ce moment est d'utiliser ASP: Literals et de compiler complètement le HTML dans CodeBehind, mais cela semble plutôt maladroit. Toute autre approche, ou est-ce que je n'ai pas de chance?

Répondre

3

Vous pouvez remplacer la génération d'ID client afin que ASP.NET ne mangle pas les noms de contrôle. J'ai posté un exemple dans this thread.

L'idée de base est de remplacer les propriétés ClientID et UniqueID dans une classe descendante, puis d'utiliser cette classe à la place du contrôle ASP.NET intégré. L'exemple fourni illustre une zone de texte, mais cela s'applique à n'importe quel contrôle serveur.

La bonne chose à propos de cette approche est qu'elle ne nécessite pas de passer des identifiants au balisage. Cependant, c'est à vous de vous assurer que vous ne générez pas plusieurs composants avec le même ID (par exemple, dans un répéteur ou une listview).

En outre: JAMAIS JAMAIS JAMAIS JAMAIS générer votre balisage dans le code-behind. Utilisez un listview, un répéteur ou un autre contrôle. Générer un balisage dans le code rend un cauchemar de maintenance, surtout quand un concepteur (quelqu'un versé dans les graphiques, HTML et CSS, mais pas nécessairement C#) doit apporter des modifications à votre travail. Faites-vous une faveur et gardez le balisage dans l'ASPX où il appartient, et codez dans le .cs.

Mise à jour exemple de code partiel du fil référencé:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 


namespace MyControls 
{ 
    public class Textbox : System.Web.UI.WebControls.TextBox 
    { 
     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 

    } 

    public class Button : System.Web.UI.WebControls.Button 
    { 

     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 
    } 
} 
+0

Ne jamais dire jamais. Rendu des balisages n'est pas trop mauvais aussi longtemps que vous ne mettez pas de style là-bas. –

4

Ceci est une plainte très commune avec ASP.NET Web Forms et malheureusement, vous ne pouvez pas faire grand chose à ce sujet. .NET 4 nous donnera plus de contrôle sur la génération de ClientID, mais jusque-là, ça va inévitablement être un casse-tête.

Une option consisterait à créer une chaîne JSON dans le code qui contient certains des ID client dont vous avez besoin et utiliser ClientScript.RegisterClientScriptBlock pour l'exposer côté client. Ce n'est pas joli mais c'est mieux que de générer du code HTML dans le code.

code Derrière:

String jsonClientIDs = "window.ClientIDs = { " + 
         "oneControlClientID: '" + oneControl.ClientID + "'," + 
         "twoControlClientID: '" + twoControl.ClientID + "'" + 
         "}"; 

Page.RegisterClientScriptBlock(GetType(), "ClientIDs", jsonClientIDs, true); 

Javascript:

function myFunction() 
{ 
    $(ClientIDs.oneControlClientID).hide(); 
    $(ClientIDs.twoControlClientID).show(); 
} 
Questions connexes