2009-04-14 7 views
3

Ich versuche einen Weg zu finden, etwas zu tun, das ich für möglich halte, aber ich vermisse nur den Punkt - also hoffentlich kann mir jemand einen geben Bit of a Nudge :)Abrufen von DataItem aus RepeaterItem nach Datenbindung (während eines Event-Handlers)

Ich benutze Datenbindung in ASP.NET (Viewstate ausgeschaltet - so mit Controlstate für ein paar Dinge hier und da), um einen Repeater (RepeaterPriceClasses), die eine Repeater in jedem ItemTemplate (RepeaterPriceBands). Im Grunde erstellt dies eine Tabelle aus Text und einer Dropdown-Liste in jeder Zelle.

Ich versuche einen Weg zu finden, um den RepeaterOuter im Event-Handler einer Schaltfläche aufzulisten, um mir eine Liste aller ursprünglich gebundenen Elemente zu geben, die jetzt eine Dropdown-Liste mit einem Wert von> 0 haben Was ist das für ein Wert?

public Dictionary<Price, int> SelectedPrices 
{ 
    get 
    { 
     var sel = new Dictionary<Price, int>(); 
     foreach(RepeaterItem itemClass in repeaterPriceClasses.Items) 
     { 
      var repeaterPriceBands = itemClass.FindControl("repeaterPriceBands") as Repeater; 

      foreach(RepeaterItem itemBand in repeaterPriceBands.Items) 
      { 
       var context = (Price)itemBand.DataItem; 
       var listQty = itemBand.FindControl("listQty") as DropDownList; 

       if(listQty.SelectedValue.ToInt32() > 0) 
       { 
        sel.Add(context, listQty.SelectedValue.ToInt32()); 
       } 
      } 
     } 
     return sel; 
    } 
} 

Jetzt schlägt fehl, weil die itemBand.DataItem immer null ist nach Datenbindung abgeschlossen ist.

Mit welcher Technik soll ich das umgehen?

  1. verstecktes Feld mit Primärschlüssel darin (nicht ideal, da missbraucht werden kann, und fügt Gewicht auf der Seite)

  2. Suche bei ursprünglichen Daten im Cache basierend auf Indizes (scheint nur falsch)

  3. oder etwas sonst/besser ...?

EDIT: Gibt es noch mehr Informationen, dass ich diese beantworten helfen bieten?

+0

Ja. Stimme zu, es ist offen für Missbrauch. Aber mit einer "Hidden" -Variable (Sie müssen es zu einem Server-Steuerelement machen oder verwenden Sie asp: Versteckt) wird die Viewstate der Seite erhöhen, so dass es ein bisschen schwer. – Kirtan

+0

Hallo, schau dir die Antwort an ([Edit] -Tag). Ich habe es etwas verfeinert und an eine neue Methode gedacht, mit der Sie es umsetzen können. Überprüfen Sie es und sagen Sie mir, ob das besser passt oder nicht. Vielen Dank. – Kirtan

Antwort

1

Sie können versuchen, Ihren HTML-Elementen im ItemDataBound-Ereignis zusätzliche Attribute hinzuzufügen, wenn DataItem verfügbar ist.

ddlSomething.Attributes["Attribute1"] = dataItemObject.PropertyName; 

[Bearbeiten] Neben Attribute verwenden, können Sie einige Array machen für jede Zeile mit JSON-Objekte wie dieses.

var repeaterItemAttributes = [ { Prop1: val1, Prop2: val2, ... }, { ... }, ... ] 

also durch diese verwenden, werden Sie nicht die Attribute machen müssen, und Ihr Code XHTML-konform sein (tho es ist nicht erforderlich). Sie können dann das Objektarray durchlaufen und eine beliebige Eigenschaft lesen. Sie können die Lichtverschlüsselung, über die Sie gesprochen haben, auch auf die Eigenschaftswerte anwenden. [/ Edit]

+0

Das ist nicht wirklich anders als nur ein verstecktes Feld in die Repeater Item Vorlage einzubetten, oder? Es ist immer noch offen für Missbrauch? –

+0

Ich habe mich tatsächlich für diese Option in Kombination mit einer leichten Verschlüsselung entschieden, die auf dem Maschinenschlüssel der App basiert. Natürlich bestätigt das Markup dann nicht XHTML - aber das macht keinen Unterschied! :) –