2009-07-24 4 views
0

Je veux emballer un morceau de logique de rendu HTML dans un contrôle utilisateur. Ensuite, je veux passer un objet produit personnalisé (titre, miniature, id, etc.) à UserControl qu'il peut utiliser quand il rend. Idéalement, je veux l'utiliser dans un répéteur (ou pour une boucle) et passer l'objet produit personnalisé actuel dans l'UC. Chaque exemple que j'ai vu a traversé des chaînes sur la balise UC mais ce n'est pas vraiment ce que je veux faire car cela signifie que j'aurai des références partout où il faut mettre à jour si un nouveau champ a besoin d'être rendu.Passez un objet dans un UserControl dans un répéteur? .Net 1

Des idées?

.Net 1 en utilisant VB.net (pas mon premier choix pour .net donc aller simple)

exemple HTML pour nous allons, ce serait dans la page .ascx:

<div> 
    <h3><%= myProd.title %></h3> 
    <img src="<%= myProd.thumbnail %>" /> 
    <p> 
    <%= myProd.description %> 
    </p> 
</div> 

MISE À JOUR:

Ok, donc avec un peu de piratage ici est ce que je suis venu avec, ce ne fonctionne pas bien, quelle est la pièce manquante de ce puzzle?

Créer un UserControl et ajoutez ceci au code derrière:

Public Class ProductRender 
    Inherits System.Web.UI.UserControl 

#Region " Web Form Designer Generated Code " 

    'This call is required by the Web Form Designer. 
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() 

    End Sub 

    'NOTE: The following placeholder declaration is required by the Web Form Designer. 
    'Do not delete or move it. 
    Private designerPlaceholderDeclaration As System.Object 

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 
     'CODEGEN: This method call is required by the Web Form Designer 
     'Do not modify it using the code editor. 
     InitializeComponent() 
    End Sub 

#End Region 

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     'Put user code to initialize the page here 
    End Sub 

    Private _product As productItem 

    Public Property myProd() As productItem 
     Get 
      myProd = Me._product 
     End Get 
     Set(ByVal Value As productItem) 
      Me._product = Value 
     End Set 
    End Property 
End Class 

Dans la page UC ascx J'ai simplement le code html ci-dessus.

Dans la page qui utilise l'UC j'ai simplement ajouté ce qui suit pour le test:

...usual ascx header stuff... 
<%@ Register TagPrefix="ORC" TagName="productRender" Src="productRender.ascx" %> 
<ORC:productRender id="Assetrender1" runat="server" asset="<%# getDummyProduct() %>" /> 

dans le code derrière je déclare getDummyProduct comme si:

Public Function getDummyProduct() As productItem 
    getDummyProduct = New productItem("DVD Player", "It plays DVDs!", "some_thumb.jpg", 30) 
End Function 

Pourtant, dans ma page ASCS je reçois : "Référence d'objet non définie sur une instance d'un objet"

Line 1: <%@ Control Language="vb" AutoEventWireup="false" Codebehind="ProductRender.ascx.vb" Inherits="MyApp.ProductRender" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> 
Line 2: <h3> 
Line 3: <%= myProd.title %> 
Line 4: </h3> 
+0

Que voulez-vous dire par ".NET 1"? 1,0? 1.1? Faute de frappe? –

+0

.Net Version 1.1 dans VB.net –

Répondre

0

Slaps front

besoin d'appeler DataBind dans Page.OnLoad pour le databinding au travail, ce qui explique pourquoi je recevais l'objet non a trouvé!

2

Je peux penser à plusieurs approches s.

Je commencerais par vous demander si vous avez déjà fait des répéteurs imbriqués. Si non, commencez par là pour que la prochaine chose que je vais dire soit logique. (Il est le concept que vous avez besoin pour obtenir d'abord.)

http://support.microsoft.com/kb/306154

Vous pouvez créer votre contrôle de l'utilisateur afin qu'il puisse être lié aux données, et d'utiliser les concepts des répéteurs imbriqués pour datbind ce contrôle.

Une autre option viable consiste à utiliser l'événement ItemDataBound du répéteur pour ajouter un contrôle dans le code-behind.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

Une troisième option serait de créer une fonction côté serveur et mettre un appel de méthode dans le ItemTemplate

<ItemTemplate> 
    <%# DisplayProduct(DataBinder.Eval(Container,"DataItem.ProductId")) %> 
</ItemTemplate> 

...

Public Function DisplayProduct(ByVal ProductID as Integer) AS String 
... logic goes here 
End Function 

Tous les trois fonctionneront, et il y a des avantages et des inconvénients à chacun. La première option est probablement la plus "appropriée", mais vous voudrez faire quelque chose qui vous convient. Personnellement, je vais essayer tous les trois et voir lequel est le plus performant.

------------ Ajouté --------------------

Je vois ... Je pense que mon libellé peut être source de confusion ...

ce que je pense à se LOOK faire ascx comme un contrôle databound ...

ce que je l'ai fait dans le passé iscreate un UserControl et expose une propriété publique en elle .

À partir du code derrière la ASCX (pardonnez-moi si la VB syntaxe est éteint .. Je ne l'ai pas fait VB pendant quelques années):

Dim _RecordID as Integer = 0 

Public Property RecordId 
    Get 
     Return _RecordID 
    End Get 
    Set(ByVal Calue as Integer) 
     _RecordID = Value 
    End Set 
    End Property 

et dans l'événement Page_Load du ascx , mettez votre code pour charger les données, comme n'importe quelle page aspx, en utilisant la propriété RecordID.

ensuite sur la page qui héberge le fichier ASCX

<%@ Register TagPrefix= = "dds" TagName="ProductControl" .... %> 
    <ItemTemplate> 
     <dds:ProductControl RecordId = '<%# (DataBinder.Eval(Container,"DataItem.ProductId")) %>' 
    </ItemTemplate> 
+0

DataBinding un UserControl me semble plus comme le chemin à parcourir, mais de retour à la question, comment puis-je faire? Je n'ai pas encore trouvé un exemple simple de la façon de le faire. –

+0

Puisque vous pouvez mettre tout ce que vous aimez dans un répéteur, pourquoi ne pas simplement utiliser les répéteurs imbriqués? J'ai jeté ça dans ma tête depuis que j'ai posté la réponse, et plus j'y pense, créer votre propre UserControl ajoute à la complexité. Je tiens à garder les choses aussi simples que possible. Bien sûr, vous pouvez créer un contrôle utilisateur Web ascx et utiliser les concepts du premier lien de ma réponse pour imbriquer celui-ci dans le répéteur parent. – David

+0

Mais qu'en est-il de la réutilisation du code? J'ai besoin d'utiliser le même bloc de HTML (pour le rendu des produits) sur plusieurs pages. Dans Classic ASP, j'utiliserais simplement une fonction et lui passerais un objet, c'est à peu près ce que je suis après ici. –

Questions connexes