2009-04-14 4 views
3

J'essaie de trouver un moyen de faire quelque chose qui, selon moi, doit être possible, mais je manque juste le but - alors j'espère que quelqu'un peut me donner un J'utilise la liaison de données dans ASP.NET (viewstate désactivé - en utilisant controlstate pour quelques choses ici et là) pour rendre un répéteur (repeaterPriceClasses) qui a un répéteur dans chaque itemtemplate (repeaterPriceBands). Fondamentalement, cela rend une table sur un texte et une liste déroulante dans chaque cellule. J'essaie de trouver un moyen d'énumérer le repeaterOuter à l'intérieur du gestionnaire d'événement d'un bouton pour me donner une liste de tous les éléments liés à l'origine qui ont maintenant une liste déroulante avec une valeur de> 0, ainsi que quelle est cette valeur.Récupérer DataItem à partir de RepeaterItem après la liaison de données (pendant un gestionnaire d'événements)

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; 
    } 
} 

Maintenant, cela échoue car itemBand.DataItem est toujours NULL une fois la liaison de données terminée.

Quelle technique dois-je utiliser pour contourner ce problème?

  1. Champ caché avec des clés primaires dans ce (pas idéal comme peut être abusé et ajoute poids à la page)

  2. Recherche de données mises en cache originales basées sur les indices (juste semble mal)

  3. ou autre else/better ...?

EDIT: Y at-il plus d'informations que je pouvais fournir pour aider cette obtenir une réponse?

+0

Oui. D'accord, c'est ouvert à l'abus. Mais l'utilisation d'une variable "Hidden" (vous devrez en faire un contrôle serveur ou utiliser asp: Hidden) augmentera l'état de view de la page, le rendant ainsi un peu lourd. – Kirtan

+0

Salut, vérifiez la réponse (balise [Modifier]). Je l'ai raffiné un peu, et j'ai pensé à une nouvelle méthode avec laquelle vous pouvez l'implémenter. Vérifiez-le et dites-moi si cela conviendra mieux ou non. Merci. – Kirtan

Répondre

1

Vous pouvez essayer d'ajouter des attributs supplémentaires à vos éléments HTML dans l'événement ItemDataBound lorsque DataItem est disponible.

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

[Modifier] Outre l'utilisation des attributs, vous pouvez rendre une tableau contenant des objets JSON comme celui-ci, pour chaque ligne.

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

Ainsi, en utilisant cela, vous n'aurez pas à rendre les attributs, et votre code sera compatible XHTML aussi (quoique ce ne est pas nécessaire). Vous pouvez ensuite parcourir le tableau d'objets et lire les propriétés de votre choix. Vous pouvez également appliquer le chiffrement de la lumière dont vous parliez aux valeurs de la propriété. [/ Editer]

+0

Ce n'est pas vraiment différent de simplement intégrer un champ caché dans le modèle d'élément répéteur, mais est-ce? C'est toujours ouvert à l'abus? –

+0

J'ai effectivement décidé d'opter pour cette option en combinaison avec un léger chiffrement basé sur la clé de l'application. Bien sûr, le balisage ne valide pas XHTML - mais cela ne fait pas de différence! :) –

Questions connexes