2010-05-20 4 views
4

ok, je travaille sur un contrôle personnalisé qui peut contenir du javascript, et lire ceci hors de la page dans un champ de chaîne.Contrôle personnalisé C# pour obtenir le texte interne en tant que chaîne

Ceci est une solution de contournement pour le javascript dynamique dans un panneau de mise à jour.

En ce moment, je l'ai travailler, mais si je tente de mettre un serveur à l'intérieur du bloc:

<custom:control ID="Custom" runat="server"> 
    <%= ControlName.ClientID %> 
</custom:control> 

Le compilateur ne l'aime pas. Je sais que ceux-ci sont générés lors de l'exécution, et donc peut-être pas compatible avec ce que je fais, mais est-ce que quelqu'un a une idée de comment je peux obtenir ce travail?

EDIT

message d'erreur: blocs de code ne sont pas pris en charge dans ce contexte

EDIT 2

Le contrôle:

[DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ControlValueProperty("Text"), DefaultProperty("Text"), ParseChildren(true, "Text"), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] 
public class CustomControl : Control, ITextControl 
{ 
    [DefaultValue(""), Bindable(true), Localizable(true)] 
    public string Text 
    { 
     get 
     { 
      return (string)(ViewState["Text"] ?? string.Empty); 
     } 

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

Quelle erreur obtenez-vous? quel est le ControlName? Si c'est l'ID du contrôle personnalisé que vous avez écrit, il doit s'agir de Customer.ClientID et non de ControlName.ClientID. – 24x7Programmer

+0

Désolé, voir la mise à jour. –

+0

Les noms des contrôles ne sont que des noms composés pour donner un exemple de ce que j'essaie d'obtenir, je pense que l'utilisation de la balise pour mon contrôle serait plutôt idiot :) –

Répondre

1

Le compilateur est d'écrire, blocs de code côté serveur sont uniquement pris en charge dans le contexte d'un ITemplate.

Le « texte » propriété doit être définie comme celui-ci ...

<custom:control ID="Custom" runat="server" Text="YourText"> 

En utilisant ITemplate vous pouvez le déclarer dans le codebehind comme ...

public ITemplate Text 
{ 
    get; 
    set; 
} 

Mais vous devez faites ceci ...

<custom:control ID="Custom" runat="server"> 
    <Text><%= ControlName.ClientID %></Text> 
</custom:control> 

Cela dit, si vous avez un contrôle personnalisé, pourquoi ne pas le faire dans le code ind ...

this.text = ((ITextControl)Page.FindControl(controlName)).Text; 

Le problème est, ce n'est pas très dynamique.

Je préférerais l'option gabarit. Plus difficile à implémenter cependant.

+0

Sera-t-il convertible en chaîne via l'option ITemplate? –

Questions connexes