2009-07-13 7 views
1

J'ai actuellement ce bloc de code (ou quelque chose de similaire) sur presque toutes mes pages:Quelle est la meilleure façon de "conclure" du HTML avec un contrôle utilisateur?

<div class="tasks"> 
    <ul> 
     <li><a href="#">Do something</a></li> 
     <li><a href="#">Do something else</a></li> 
    </ul> 
</div> 

Cependant, je dois en faire un contrôle utilisateur. Je voudrais quelque chose qui ressemble à ce qui suit:

<foo:TaskList id="foo" runat="server"> 
    <Task><a href="#">Do something</a></Task> 
    <Task><a href="#">Do something else</a></Task> 
</foo:TaskList> 

ou même:

<foo:TaskList id="foo" runat="server"> 
    <Tasks> 
     <ul> 
      <li><a href="#">Do something</a></li> 
      <li><a href="#">Do something else</a></li> 
     </ul> 
    </Tasks> 
</foo:TaskList> 

Je me rends compte que je suis en utilisant le concept de là-bas « modèle » et je me rends compte aussi que ce n'est pas comment vous est destiné à utiliser les contrôles utilisateur Template. Alors .. comment suis Je voulais emballer une partie variable de HTML dans un contrôle utilisateur?

PS. Je ne veux pas utiliser DataBinding ou code-behind pour remplir ce contrôle. Tous les éléments doivent être visibles dans le fichier ASPX.

+0

... vous voulez dire que vous voulez que les articles visibles dans la Designer de Visual Studio? Pourquoi? –

+0

Je n'avais pas vraiment pensé au designer. Je veux juste pouvoir les voir dans le code ASPX. – James

Répondre

1

Regardez ci-dessous ces classes peuvent vous donner le balisage ci-dessous dans vos pages .aspx. Vous pouvez continuer à aller plus loin. Tout ce que vous devez avoir est une propriété sur l'objet parent. Donc c'est assez simple à réaliser.

<Test:TestUserControl> 
    <Tasks> 
     <Test:Task Value="Some Value" Text="Some Text" /> 
     <Test:Task Value="Another Value" Text="More Text" /> 
    </Tasks> 
</Test:TestUserControl> 

namespace TestWebControls 
{ 
    public class TestUserControl : WebControl 
    { 

     private List<Task> _Tasks; 

     [NotifyParentProperty(true)] 
     [PersistenceMode(PersistenceMode.InnerProperty)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public List<Task> Tasks 
     { 
      get 
      { 
       return _Tasks; 
      } 
      set 
      { 
       _Tasks = value; 
      } 
     } 

     public TestUserControl() 
     { 

     } 
    } 

    public class Task : WebControl 
    { 
     public string Value { get; set; } 
     public string Text { get; set; } 
    } 
} 

Maintenant il y a plus de travail à faire quand il s'agit de rendu. Alors cherchez Server Controls dans ASP.NET et vous serez en mesure de terminer le reste. Vous devrez créer un concepteur afin que les contrôles peuvent être vus au moment du design. Et puis un moyen de les rendre.

+0

C'est intéressant, merci. Est-ce que la même chose peut être réalisée avec un contrôle utilisateur? (Et y at-il un avantage dans cela?) – James

+0

Eh bien c'est un contrôle d'utilisateur mais au lieu de le faire avec un concepteur, nous le faisons avec du code C#. Je n'ai pas vraiment essayé avec un contrôle utilisateur. Je ne suis pas sûr que vous pourriez, car il a besoin de List <> ou de tableau pour y placer les sous-éléments. –

0

Lorsque vous dites que vous avez le même code HTML sur plusieurs pages, vous pouvez également consulter les pages maîtres. Une page maître permet de définir un «cadre de page» commun pouvant être réutilisé par plusieurs pages (de contenu).

(mais peut-être que cette suggestion est complètement inappropriée, puisque vous connaissez probablement déjà les pages maîtres).

0

Vous ne pouvez pas passer de paramètres à UserControls dans la source HTML.

Vous devez définir les paramètres dans l'événement Page_Load de la page:

public class MyUserControl : UserControl 
{ 
    public void SetTasks(Tasks[] tasks) 
    { 
     // code 
    } 
} 

et dans le code source de la page:

protected void Page_Load(object sender, EventArgs e) 
{ 
    myUserControl.SetTasks(... tasks ...); 
} 
Questions connexes