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: < span>ItemTemplate>
5: < span>< span>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: < span>ItemTemplate>
5: < span>< span>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: < span>ItemTemplate>
8: < span>< span>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.