2009-07-24 4 views
0

ユーザーコントロールにHTMLレンダリングロジックの塊をまとめたいと思います。次に、レンダリング時に使用できるUserControlにカスタム製品オブジェクト(タイトル、サムネイル、IDなど)を渡したいと思います。理想的には、これをリピータ(またはループ)で使用して、現在のカスタム製品オブジェクトをUCに渡したいと思います。オブジェクトをリピータのUserControlに渡しますか? .Net 1

私が見たすべての例は、UCタグの文字列を通過していますが、実際にはやりたいことはありません。つまり、レンダリングが必要な新しいフィールドを追加する必要があります。

アイデア?行く私たちを取得するためにVB.net(.NETのない私の最初の選択肢そう簡単に行く)

HTMLの例を使用して

ネット1、これはた.ascxページで次のようになります。

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

更新:

ここではいくつかのハッキングがありますが、これは問題なく動作していますが、このパズルの欠けているものは何ですか?

ユーザーコントロールを作成し、背後にあるコードにこれを追加:UCのASCXページで

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 

を私は単純に上記のHTMLを持っています。私はそうとgetDummyProductを宣言するコードビハインドで

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

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

はまだ私のASCのページに私が手にUCを使用するページで

は、私は単にテストのために、以下を追加しました: "オブジェクト参照がオブジェクトのインスタンスに設定されていません"

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

".NET 1"とはどういう意味ですか? 1.0? 1.1?打ち間違え? –

+0

.Netバージョン1.1 VB.net –

答えて

0

たたく額

に私はオブジェクトではなくなった理由を説明すること、データバインディングが機能するためにPage.OnLoadでのDataBindを呼び出す必要があります見つけた!

2

私はいくつかのアプローチが考えられますs。

ネストされたリピーターを実行したことがあるかどうかを確認することから始めます。もしそうでなければ、そこから始めて、次のことについて私が言っていることは理にかなっています。 (それはあなたが最初に取得する必要がコンセプトです。)

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

あなたはそれがデータバインドできるように、ユーザーコントロールを作成し、このコントロールをdatbindするために、ネストされたリピータからの概念を使用することができます。

もう1つの実行可能なオプションは、コードビハインドでコントロールを追加するためにリピータのItemDataBoundイベントを使用することです。

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

第三の選択肢は、サーバー側の関数を作成し、ItemTemplateに

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

でそれにメソッド呼び出しを置くことであろう...

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

3つすべてが機能し、それぞれに賛否両論があります。最初のオプションはおそらく最も適切なものですが、あなたが快適なことをしたいと思うでしょう。個人的に私は3つすべてを試して、どちらが良いかを見ます。

------------追加--------------------

私は私の言葉を思います...紛らわしいかもしれ

私は...データバインドされたコントロールのようなASCXのLOOKを作っていることを考えている私は、ユーザーコントロールisCreateは、過去に行われ、それにパブリックプロパティを公開しました何

。 ASCXの背後にあるコードから

(VBの構文がオフになっている場合、私は数年のためのVBを行っていない...私を許して):

ASCXのPage_Loadイベントで
Dim _RecordID as Integer = 0 

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

とRecordIDプロパティを使用して、aspxページと同様に、データをロードするコードを記述します。

はその後ASCXファイルをホストするページ

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

UserControlのDataBindingは私にはもっと行く方法のように聞こえますが、質問に戻ると、どうすればいいですか?私はまだそれを行う方法の簡単な例を見つけることができません。 –

+0

リピーターの中に好きなものを置くことができるので、ネストされたリピーターを使用するだけではどうですか?私は答えを掲示して以来、私の頭の中でこれを投げていました。そして、私はそれを考えて、独自のUserControlを作成するだけで複雑さが増しています。できるだけシンプルにすることが大切です。 もちろん、ascx Webユーザーコントロールを作成して、親リピータの中にネストするために、私の答えに最初のリンクの概念を使用することができます。 – David

+0

しかし、コードの再利用はどうですか?私はいくつかのページで同じHTMLブロック(製品のレンダリング用)を使用する必要があります。古典的なASPでは、関数を使ってオブジェクトを渡すだけです –

関連する問題