2009-07-24 2 views
0

사용자 정의 컨트롤에서 HTML 렌더링 로직을 정리하고 싶습니다. 그런 다음 렌더링 할 때 사용할 수있는 UserControl에 사용자 지정 제품 개체 (제목, 축소판, ID 등)를 전달하려고합니다. 이상적으로는 이것을 리피터 (또는 for 루프)에서 사용하고 현재 맞춤 제품 오브젝트를 UC로 전달하려고합니다.리피터의 UserControl에 객체를 전달 하시겠습니까? .Net 1

내가 본 모든 예제는 UC 태그의 문자열을 통과했지만 실제로는 원하지 않는 방식으로 렌더링을해야하는 새로운 필드를 추가해야하는 모든 곳에서 참조가 필요합니다.

아이디어가 있으십니까?

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

: VB.net (나의 첫번째 .NET에 대한 선택을 너무 쉽게 이동) 우리는, 이것이의 .ascx 페이지에있을 것입니다 가야하는

HTML 예제를 사용하여

닷넷 (1) 업데이트 :

그래, 여기 주변에서 해킹하는 것은 내가 생각해내는 것, 그게 작동하지 않는 것,이 퍼즐의 누락 된 조각은 뭐니?

은 UserControl을 생성하고 뒤에 코드에 이것을 추가 :

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 

를 UC의 ASCX 페이지에서 단순히 위의 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에서 데이터 바인딩을 호출 할 필요가 설명합니다

녹이다!

2

나는 몇 가지 접근법을 생각할 수 있습니다. 에스.

중첩 된 리피터를 수행 한 적이 있는지 물어 보는 것이 좋습니다. 그렇지 않다면 거기에서 시작하여 내가 말하는 바로 그 다음 말이 의미를 갖도록하십시오. (그것은 당신이 첫번째하는 데 필요한 개념입니다.)

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

당신은 데이터 바인딩 할 수 있도록 사용자 정의 컨트롤을 만들고이 컨트롤을 datbind하는 중첩 된 리피터에서 개념을 사용할 수 있습니다.

또 다른 가능한 옵션은 코드 숨김에 컨트롤을 추가하기 위해 repeater의 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 가지 모두가 효과적 일 것이며, 각각 장단점이 있습니다. 첫 번째 옵션은 아마도 가장 "적절한"것이지만 당신이 편한 어떤 일을하기를 원할 것입니다. 개인적으로 나는 세 가지 모두를 시도하고 어느 것이 더 잘 수행되는지 봅니다.

------------ 내가 볼

-------------------- 추가 ... 내 표현을 생각한다 ... 혼동 될 수 있습니다

내가 ... 데이터 바인딩 컨트롤 같은 ASCX 모양을하고있다 생각하고있어 내가 UserControl을 iscreate 과거에 그 안에 공용 속성을 노출 한 무엇

. 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 

과 :

(나는 몇 년 동안 VB를 수행하지 않은 VB 구문이 꺼져있는 경우에 저를 용서 ..)에 ASCX의 뒤에있는 코드에서

RecordID 속성을 사용하여 aspx 페이지와 마찬가지로 데이터를로드하도록 코드를 작성하십시오. ASCX 파일을 호스팅하는 페이지에 다음

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

DataBinding UserControl은 나에게 길을 더가는 것처럼 들리지만 질문으로 돌아 가면 어떻게 할 수 있습니까? 나는 그것을하는 방법에 대한 간단한 예제를 아직 찾지 못했다. –

+0

Repeater 안에 원하는 것을 넣을 수 있으므로 중첩 된 repeater를 사용하지 않는 이유는 무엇입니까? 내가 대답을 게시 한 이래 내 머리에 던져 버렸어, 그리고 더 생각해, 자신의 UserControl을 만드는 단지 복잡성을 추가합니다. 나는 물건을 가능한 한 간단하게 유지해야한다. 물론, ascx 웹 사용자 컨트롤을 만들고 내 대답에서 첫 번째 링크의 개념을 사용하여 상위 중계기 내에 중첩시킬 수 있습니다. – David

+0

하지만 코드를 재사용하면 어떨까요? 여러 페이지에서 동일한 HTML 블록 (제품 렌더링 용)을 사용해야합니다. 클래식 ASP에서 나는 함수를 사용하여 객체를 전달한다. –