2009-07-13 5 views
1

Im Moment habe ich diesen Code-Block (oder so ähnlich) auf fast all meinen Seiten:Was ist der beste Weg, um HTML mit einem Benutzersteuerelement zu "wickeln"?

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

Allerdings habe ich diese in eine Benutzersteuerung drehen müssen. Ich suche etwas, das wie folgt aussieht:

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

oder sogar:

<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> 

Ich weiß, dass ich die „Vorlage“ -Konzept da bin mit und ich merke auch, dass das ist nicht, wie Sie sollen Template-Benutzersteuerelemente verwenden. Also .. wie am Ich wollte ein variables Stück HTML in ein User Control einpacken?

PS. Ich möchte DataBinding oder Code-behind nicht verwenden, um dieses Steuerelement zu füllen. Alle Elemente müssen in der ASPX-Datei sichtbar sein.

+0

... Sie meinen Sie die Einzelteile wollen sichtbar in der sein Designer von Visual Studio? Warum? –

+0

Ich hatte nicht wirklich über den Designer .. Ich möchte nur in der Lage sein, sie im ASPX-Code zu sehen. – James

Antwort

1

Betrachten Sie unten diese Klassen können Sie die unten Markup in Ihren ASPX-Seiten geben. Sie können weiter gehen. Sie benötigen lediglich eine Eigenschaft für das übergeordnete Objekt. So ist es ziemlich einfach zu erreichen.

<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; } 
    } 
} 

Jetzt gibt es mehr Arbeit, wenn es um das Rendern geht. Also schauen Sie in ASP.NET Server Controls nach und Sie werden den Rest erledigen können. Sie müssten einen Designer erstellen, damit die Steuerelemente zur Entwurfszeit angezeigt werden können. Und dann eine Möglichkeit, sie zu rendern.

+0

Das ist interessant, danke. Kann das gleiche mit einer Benutzerkontrolle erreicht werden? (Und gibt es da einen Vorteil?) – James

+0

Nun, es ist eine Benutzerkontrolle, aber anstatt es mit einem Designer zu tun, machen wir es mit C# -Code. Ich habe es nicht wirklich mit einer Benutzerkontrolle ausprobiert. Ich bin mir nicht sicher, ob Sie das können, da es List <> oder Array benötigt, um die Unterelemente darin zu platzieren. –

0

Wenn Sie sagen, dass Sie auf vielen Seiten denselben HTML-Code haben, können Sie auch Masterseiten ausprobieren.

Eine Masterseite ermöglicht es Ihnen, einen gemeinsamen "Seitenrahmen" zu definieren, der von mehreren (Inhalts-) Seiten wiederverwendet werden kann.

(aber vielleicht ist dieser Vorschlag völlig unpassend, da Sie wahrscheinlich bereits über Masterseiten wissen).

0

Sie können in der HTML-Quelle keine Parameter an UserControls übergeben.

Sie müssen die Parameter in der Seite Page_Load Ereignis einzustellen:

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

und im Quellcode der Seite:

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