Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET MVC - Datenübergabe an Html.RenderPartial() in Repeater-Control

UPDATE: Das funktioniert so leider nicht, Auflösung hier.

Das bekannte und (zu Recht) beliebte Repeater-Control funktioniert auch mit ASP.NET MVC, da es von sich aus ja nichts anderes macht, als beliebige Daten in Reihe zu rendern. Wozu also selbst die Schleife durchlaufen, wenn man auf so hübsche Helfer zurückgreifen kann, die ASP.NET ja auch so erfolgreich gemacht haben (und machen). Dazu werde ich in Kürze noch etwas posten, was dem einen oder anderen vielleicht das Thema Paging (Blättern) erleichtert.

Aber zurück zum Repeater. Setzt man WebForms ein, kann man innerhalb des Repeaters beliebige ASP.NET-Controls verwenden und auch ganz simpel Daten an diese Controls binden. Beispiel:

   1:  <asp:Repeater ID="RMessages" runat="server">
   2:      <ItemTemplate>
   3:          <asp:Label runat="server" Text='<%# Eval("Name") %>' />
   4:      ItemTemplate>
   5:  asp:Repeater>

Wenn man nun ASP.NET MVC verwendet und z.B. ein wiederkehrendes Element in eine "Partial View", d.h. das was bei WebForms ein UserControl ist, auslagert, sollte man die natürlich auch im Repeater einbinden können. Das funktioniert auch:

   1:  <asp:Repeater ID="RMessages" runat="server">
   2:      <ItemTemplate>
   3:          <% Html.RenderPartial("~/Views/Shared/Username.ascx"); %>
   4:      ItemTemplate>
   5:  asp:Repeater>

An so eine PartialView kann man auch Daten übergeben, allerdings nicht mit Eval(). Denn Eval & Co. kann man nur für "datengebundene Steuerelemente" verwenden. Wie bekommt man nun also den Namen in die PartialView rüber?

So:

   1:  <asp:Repeater ID="RMessages" runat="server" 
   2:      OnItemDataBound="RMessages_ItemDataBound">
   3:      <ItemTemplate>
   4:          <% Html.RenderPartial("~/Views/Shared/Username.ascx", 
   5:                 new xyz.Website.Views.Shared.UsernameViewData() 
   6:                 { Username = CurrentUsername }); %>
   7:      ItemTemplate>
   8:  asp:Repeater>

 

   1:  public partial class Inbox : ViewPage
   2:  {
   3:   
   4:      public string CurrentUsername ;
   5:   
   6:      protected void Page_Load(object sender, EventArgs e)
   7:      {
   8:          if (ViewData.Model.Messages.Count > 0)
   9:          {
  10:              RMessages.DataSource = ViewData.Model.Messages;
  11:              RMessages.DataBind();
  12:          }
  13:      }
  14:   
  15:      protected void RMessages_ItemDataBound(object sender, 
  16:          RepeaterItemEventArgs e)
  17:      {
  18:          if(e.Item.ItemType == ListItemType.Item)
  19:              CurrentUsername = ((Message)e.Item.DataItem).Name;
  20:      }
  21:  }

Kurzerklärung:

Das Repeater-Control feuert weiterhin seine Events, die man aus der WebForms-Welt kennt. D.h. für jeden Durchlauf gibt es zum Beispiel "OnItemDataBound", für welches im Beispiel die Methode RMessages_ItemDataBound registriert wurde. In dieser wird der "zu bindende" Wert einfach an eine in dieser Instanz verfügbaren Variable CurrentUsername übergeben - und diese wird dann einfach in der View an die PartialView weitergereicht.

Nicht ganz so schön wie mit Eval(), aber es funktioniert prima.

Kommentare

  1. Robert schrieb am Dienstag, 28. Oktober 2008 19:00:00 Uhr:

    Ich fande den Eval Syntax irgendwie... Evil.
    Als MVC Preview 3 noch aktuell war, hatte ich ein Paging Control geschrieben - geht eigentlich auch mit den MVC Bordmitteln ganz gut :)
  2. Thomas schrieb am Dienstag, 28. Oktober 2008 19:11:00 Uhr:

    Geschmackssache was den Eval-Ausdruck angeht - er ist nicht typsicher, dafür aber sehr praktisch, die Handhabung Zusammen mit den datengebundenen Controls sehr leicht.

    Auf dein Paging-Control stößt man bei der Suche nach einer Lösung ja zwangsläufig, gefällt mir aber persönlich überhaupt nicht (was weniger mit dem Control selbst noch natürlich dir :) zu tun hat, sondern viel mehr der Art und Weise wie es auf dem Weg gelöst werden muss). Ich habe einige CustomControls in meinen Libraries die solche Sachen in bewährter Manier lösen, ich poste das fürs Paging demnächst mal.

    Aber am Ende bleibt alles Geschmackssache - und solange man jeweils die Wahl hat, ist's ja auch gut so.
  3. Thomas goes .NET schrieb am Donnerstag, 4. Dezember 2008 12:05:00 Uhr:

    Ich hatte bereits Ende Oktober kurz etwas zum Thema Datenübergabe an Html.RenderPartial() innerhalb eines ASP.NET-Repeater-Controls geschrieben. Ich habe heute keine Ahnung mehr, wie ich damals zu dem Schluss kommen konnte, dass das so funktioniert - ...


« Zurück  |  Weiter »