Wie bewahren Sie den Wert von data-binding-Ausdrucks in der Variablen
Muss ich den Zugriff auf den Wert einer gebundenen Element mehrfach in einer Vorlage. Jetzt meine ListView-template sieht wie folgt aus:
<asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="plc"><br/>
<ItemTemplate><br/>
<input type="radio" class="myrating<%# DataBinder.Eval(Container.DataItem, "Day")%>" value="3" /><br/>
<input type="radio" class="myrating<%# DataBinder.Eval(Container.DataItem, "Day")%>" value="4" /><br/>
</ItemTemplate><br/>
<LayoutTemplate><br/>
<div id="plc" runat="server"><br/>
</div><br/>
</LayoutTemplate><br/>
<EmptyDataTemplate><br/>
No data</EmptyDataTemplate><br/>
</asp:ListView><br/>
Unter bestimmten Bedingungen, die ich möglicherweise Dutzende von radio-Taste, so dass immer wieder ruft <%# DataBinder.Eval(Container.DataItem, "Day")%>
zu sein scheint ineffizient.
Möchte ich weisen Sie den Wert des Ausdrucks einer Variablen zu, und verwenden Sie dann diese variable anstelle also meine Vorlage Aussehen würde, so etwas wie dieses
<ItemTemplate><br />
<%String ClassName = "myrating" + <%# DataBinder.Eval(Container.DataItem, "Day")%><br />
<input type="radio" class="<%=ClassName %>" value="3" /><br />
<input type="radio" class="<%="ClassName" value="4" /><br />
</ItemTemplate><br />
Dieses Beispiel kann nicht kompiliert werden, aber ich hoffe, Sie bekommen die Idee.
- Gibt es spezifische performance-Probleme oder haben Sie gerade denken, tun, eine Eval-immer wieder, ist ein problem? Sie könnten immer die Klasse der radio-buttons in das ItemDataBound-Ereignis der Listenansicht.
- Ich habe nicht profiliert es noch nicht, aber ich denke, den Aufruf von Eval, immer wieder auf den gleichen Wert wird verschwenderisch sein und auch schwieriger zu pflegen. Mit ItemDataBound funktionieren würde, aber es wäre schön, wenn es ware eine einfachere Lösung.
- Ich mache etwas ähnliches, und ja... tut sich eine Eval-immer wieder, ist ein GROßES problem (für meine Anwendung) unter Berücksichtigung der Datenbank-hits beteiligt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
OnItemDataBount
Veranstaltung und die Arbeit mit DataItem mit Variablen gibt.Kannst du deiner Seite eine öffentliche variable MyRating.
Können Sie jetzt weisen Sie die variable in der expression binding-Syntax:
Ich in der Regel binden mit Listen von view-Objekten. So kann ich den Zugriff auf Eigenschaften anzeigen direkt.
Hoffe, das hilft 🙂
<%# MyRating = "myrating" + <%# Eval(Container.DataItem, "Day")%>
bewirkt, dass der resultierende Wert vonMyRating
Ausgabe in HTML.Ich persönlich halte die Einstellung HTML-element Werte in der
OnItemDataBound
Ereignis messier als in der ASP-code. Ich auch nicht, wie die Einstellung der Variablen-Wert über data-binding-Ausdruck, da es zu verursachen scheint der Wert, Ausgabe in HTML.Hier ist eine ähnliche Art und Weise zu tun, es basiert auf die anderen Antworten:
1. Erstellen Sie ein geschütztes Feld, in das code-behind-zur Verwendung als variable.
2. Verwenden Sie eine data-binding-Ausdrucks zuweisen der Variablen.
Stellen Sie sicher dazu in der versteckten server-Seite-tag, so dass das Ergebnis des Ausdrucks erscheint nicht in der resultierenden HTML-Code.
3. Verwenden Sie die variable innerhalb Datenbindungsausdrücke in den ASP-code.
Stellen Sie sicher, um data-binding-Ausdrücke zum Zugriff auf die variable. Andere Ausdrucks-Typen, die nur scheinen, um zu sehen, der default-Wert der Variablen.
Ich denke, der wesentliche Nachteil dieses Ansatzes ist die Verwendung des Feldes, die sich im Idealfall beschränkt werden, um die
ItemTemplate
element.Können Sie definieren public/protected-Variablen in der code-behind und ordnen Sie diese in Datenbindungsausdrücke.
Wenn Sie keinen Zugriff auf die code-behind (z.B. wenn Sie ändern das markup einer kompilierten Anwendung), können Sie Variablen deklarieren, in einer
script
block ausgeführt, auf dem server, z.B.:Dann in Ihrem control-binding templates:
Steckte es in die
HeaderTemplate
wenn Sie nur wollen, dass es ausgeführt werden, einmal pro databinding.Die
== null ? "" : ""
-Teil, ist zu verhindern, dass alle generierten cruft html (z.B. dieToString
Wert der zugewiesenen Wert), wird im browser gerendert.