2009-04-02 6 views
0

Ich habe ein Problem mit einer Schaltfläche Steuerelement in asp.net Webforms.asp.net web-forms commandargument Problem

Nach der Verwendung von mvc ein bisschen begann ich foreach in den ASPX-Dateien in Webforms zu verwenden, anstatt Repeater, meist Ursache aller Junk-ViewState ein Repeater erstellt.

Es funktioniert gut, wenn Sie nur über HTML-Steuerelemente iterieren. Aber ich habe eine harte Zeit mit Knopfkontrollen.

<% foreach (var r in Reports) { %> 
    <asp:LinkButton OnClick="Click_DeleteResult" CommandArgument='<%= r.ResultId.ToString() %>' runat="server">Delete</asp:LinkButton> 
<% } %> 

auf Postbacks der Command auf diese Schaltfläche wird "<% = r.ResultId.ToString()%>". Dieser Code wird also nicht ausgeführt. Gibt es eine gute Möglichkeit, Steuereigenschaften auf diese Weise zu füllen?

Antwort

0

Das ist hässlich. Der Hauptvorteil der Verwendung von ASP.NET (insbesondere MVC) ist die Trennung von Logik und Präsentation. Ich schaudere jedes Mal, wenn ich in einer aspx-Datei für die Ausführung von Code suchen muss.

Wenn Sie den ViewState "Junk" nicht mögen, dann schalten Sie ihn einfach für dieses Steuerelement aus!

<asp:Repeater ID="MyRepeater" runat="server" EnableViewState="false"> 

Wenn Sie allerdings darauf bestehen ... Ich habe Situationen wie diese gesehen, wo ASP.NET würde kein Server-Tag korrekt analysieren, wenn ich nicht auf die umliegenden Zitate fallen gelassen. Gefällt mir:

Möglicherweise nicht vollständig konform HTML, aber ASP.NET kümmert es nicht. Wenn Sie aus irgendeinem Grund die umgebenden Anführungszeichen wirklich ausgeben müssen, können Sie sie in das Server-Tag einfügen, anstatt nach draußen. Es ist kontraintuitiv, aber manchmal muss man es so machen.

0

Haben Sie eine Datenbindung Ausdruck

<%# r.ResultId %> 
-1
versuchten

darüber, wie es über den Code hinter hinzufügen, ist dies ein schnelles und schmutziges Beispiel, aber ich denke, Sie bekommen die Idee:

HtmlTable table = new HtmlTable(); 
foreach (var r in Reports) 
{ 
    LinkButton lnkbtn = new LinkButton(); 
    lnkbtn.CommandArgument = r.ResultId; 
    lnkbtn.Click += Click_DeleteResult; 
    HtmlTableRow tr = new HtmlTableRow(); 
    HtmlTableCell tc_resultID = new HtmlTableCell(); 
    tc_caseNo.Controls.Add(lnkbtn); 
    tr.Cells.Add(tc_resultID); 
    table.Rows.Add(tr); 
} 
div_yourContainerDiv.Controls.Add(table); 

ich manchmal bevorzugen diese Lösung .. hängt von der Aufgabe ab. Jedoch gibt es wahrscheinlich eine Lösung für dein gegenwärtiges Problem, das dich nicht erfordert, es zu nehmen, um hinter zu programmieren :)

Wenn du viel arbeitest Mit generischem Inhalt kann es eine ziemlich gute Möglichkeit sein, es ohne irgendeinen Viewstate-Quark-Code zu machen, der alles für die SE's vermasselt.

Alternative Sie könnten etwas tun, was ich mit Erfolg mit einigen SEO kritischen Projekten getan habe. Sie können den Anzeigestatus als Sitzung speichern und speichern und stattdessen einen Sitzungsschlüssel für den Anzeigestatus erstellen. Auf diese Weise lässt der Server den Viewstatus und nicht den Client verarbeiten. Es erzeugt zusätzliche Serverlast, aber es wird immer Kompromisse geben.