2014-12-09 15 views
0

asp.net 4.5 C#을 사용하고 있습니다. 이 작품 반면에 시도,Asp.net UserControl - 데이터 바인딩하는 방법 목록에서 개체를 바인딩?

<script runat="server"> 
Product item=new Product(); 
      </script> 
        <uc:productBox runat="server" item="<%#item%>"/>  

: 위의 멤버로 "제품"데이터 바인딩하면서,

[Bindable(true)] 
    public Product item 
    { 
     get{ 
      return _product; 
     } 
     set 
     { 
      _product = value; 
     } 

    } 

가 그때 내 컨트롤을 사용 나는 내 다음과 같은 멤버 사용자 정의 컨트롤을 만들었습니다 다음과 같은 방법으로 목록에서 바인드 동적 항목은 실패

foreach (Product item in ProductList()){%>   
        <uc:productBox runat="server" item="<%#item%>"/>  
      <%}%> 

내가받을 다음과 같은 오류 :

The name 'item' does not exist in the current context

목록의 항목을 바인딩 할 수없는 이유는 무엇이며 어떻게 해결할 수 있습니까?

답변

0

바인딩 표현식은 코드 숨김 영역에서 실제로 루프가 실행될 때 루프의 범위가 아닌 클래스의 범위에있는 변수 또는 정적 멤버에만 액세스 할 수 있습니다.

Placeholder을 사용하고 코드 목록에 코드를 채우거나 ProductList를 가져와 productBox을 빌드하는 (더 나은) use the Repeater control을 생성해야합니다.

그래서의 ItemTemplateRepeater 당신이 binding a simple list to a Repeater처럼 Item 재산에 ProductBox 및 사용 <%# (Product)Container.DataItem %> 표현을 넣어해야합니다.

작은 힌트 : ASPX에서 foreach를 작성하는 것은 잘 작성되지 않았습니다. 그러지 마. 또한 이름 규약에서는 클래스/제어/공개 멤버 이름에 대문자로 시작해야한다고 주장합니다.

+0

감사합니다. 나는 당신이 제안한 것을했는데, 이제는 "ProductsArea"라고 불리는 중계기가 있는데, 나는 ProductsArea.DataSource = Products를 사용한다; ProductsArea.DataBind(); 코드 뒤에, 앞에서 나는 를 사용한다. 그러나 Item은 항상 내 컨트롤에서 null입니다. 왜 이런거야. – Programer

+0

@Programer 'Repeater'컨트롤을 사용하지 마십시오. 'Repeater'의'ItemType'을'Product'의 전체 네임 스페이스 + 유형으로 설정 한 다음 여기에 보이는대로 '<%# Item %>'을 사용하는 것이 어떻습니까? http://stackoverflow.com/a/17328960/1540350 희망이 있습니다. 또는'<% = this.GetDataItem(). ToString() %>'을 시도하십시오. 여기에서 모든 답변을 시도하십시오. https://stackoverflow.com/questions/5011617/asp-net-repeater-bind-liststring. – modiX