2009-02-12 11 views
1

Contexte: ASP.NET 3.5/C#ASP.NET: générer de la valeur de la propriété lors de l'ajout de contrôle à la page

Salut,

J'ai créé un contrôle utilisateur

public partial class MyControl : UserControl 
{ 
    // EDIT: example first used "UniqueId" as property name, which was wrong. 
    public Guid MyId { get; set; } 
    // ... 
} 

et cet exemple l'utilisation

<uc1:MyControl 
    ID="myControl" 
    MyId="443CBF34-F75F-11DD-BE2F-68C555D89123" 
    runat="server" /> 

étapes:

  • Ajouter ce contrôle à un formulaire web (ASPX)

Résultat escompté:

  • le code HTML pour le contrôle utilisateur est ajouté, une valeur unique (correspondant à Guid.NewGuid()) pour MyId est défini dans le code HTML ASPX au moment du design en tant que valeur de l'attribut MyId.

Résultat réel:

  • le code HTML pour le contrôle utilisateur est ajouté, une valeur unique pour MyId n'est pas définie dans le code HTML au moment de la conception pour la valeur MyId d'attribut.

Si cela est impossible:

  • Solution 1: Serait-il possible d'y parvenir en utilisant un contrôle serveur? Comment?
  • Solution de contournement 2: est-il possible d'y parvenir en utilisant une tâche en mode conception UserControl?

Précision:

  • persistant la valeur de la propriété est pas un problème, car il ne change jamais une intance de contrôle et est réglé automatiquement par ASP.NET grâce à la déclaration de contrôle dans la page ASPX. L'attribut MyId n'a pas besoin d'être rendu au moment de l'exécution

Gr B!

+0

Aucune solution pour le moment? – stiduck

Répondre

0

Vous avez quelques problèmes ici, mais je vais d'abord répondre à vos questions sur les solutions de contournement.

  1. Non, vous utilisez déjà un contrôle serveur.
  2. Aucun mode de conception est juste rendre la vie du développeur facile, il n'a pas d'effet rien d'autre

Vous avez deux problèmes ici. Il y a déjà une propriété appelée UniqueID Je ne sais pas si vous essayez de surcharger cela, mais la question n'était pas claire. Le deuxième problème est que votre UniqueID n'est essentiellement stocké nulle part.Essayez le code suivant:

public Guid UniqueId { 
    get { return (Guid)ViewState["MyUserControlUniqueId"]; } 
    set { ViewState["MyUserControlUniqueId"] = value; } 
} 

qui stockera le GUID dans le ViewState afin que vous puissiez le récupérer sur le dos de poste.

Mise à jour: Compte tenu de votre commentaire, vous devez remplacer/utiliser cette méthode pour ajouter des attributs au contenu rendu.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.addattributestorender.aspx

+0

Salut Nick, J'avais renommé la propriété originale à UniqueId pour l'exemple de code, ce n'était pas mon intention de surcharger UniqueId. ViewState n'est pas mon problème, l'objectif est de faire apparaître le nouveau GUID dans le code HTML généré. –

+0

Voir le commentaire ci-dessus. –

+0

Merci pour la mise à jour, je n'étais pas assez clair. Mon objectif est d'avoir un GUID différent dans le code HTML de l'heure de conception * ASPX * chaque fois qu'un contrôle est déplacé vers une page Web par le concepteur de page. L'attribut n'a pas besoin d'être ajouté au HTML rendu. –

0

Si je comprends bien votre question, vous exposez une propriété sur votre contrôle utilisateur appelé MyId. Cela vous permet de définir la propriété où que vous placiez ce contrôle.

Ce que vous voulez également, c'est que le HTML rendu inclue également cet attribut et cette valeur.

Si tel est le cas, la propriété MyId n'est pas transmise au code HTML, c'est uniquement parce que le contrôle utilisateur a MyId en tant que propriété visible dans le concepteur.

Dans votre contrôle utilisateur, vous aurez défini le balisage qui est rendu. Ainsi, par exemple si vous avez:

<asp:Panel runat="Server" Id="myControlDiv">Some other content</asp:Panel> 

Vous pouvez alors dans votre contrôle événement prerender (ou partout où vous choisissez) mettre

myControlDiv.Attributes.Add("MyId", SomeGuid.ToString()) 

qui sera ensuite obtenir une sortie dans le code HTML comme

<div id="generatedID" MyID="443CBF34-F75F-11DD-BE2F-68C555D89123">Some other content</div> 
+0

tnx pour votre réponse. "Ce que vous voulez aussi, c'est que le HTML rendu inclue également cet attribut et cette valeur." Je peux voir pourquoi vous avez cette impression maintenant, mais ce n'était pas mon intention. Par HTML, je voulais dire le temps de conception HTML dans l'aspx. –

0

Alors vous voulez juste un identifiant unique que vous n'utilisez que dans la conception? Pourquoi ne pas surcharger Objet.GetHasCode();

Et puis l'exposer comme une propriété?

Questions connexes