2010-12-22 2 views
1

페이지 당 50/100 제품 사이에 표시되는 제품 카탈로그를 작성 중입니다. 내 사이트에 다른 탐색 섹션을 갖고 싶기 때문에 각 제품을 UserControl에 넣습니다. 글쎄, 물론 제품 자체는 아니지만 일부 레이블, divs 및 이미지. 그런 다음 데이터베이스 결과를 처리 할 때 런타임에 해당 속성을 설정합니다. 따라서 장점은 전체 사이트에 대해 1 곳에서 제품 컨트롤 만 변경해야한다는 것입니다. 루프에서 LoadControl을 사용하여 컨트롤을 페이지에 넣을 것입니다.asp.net usercontrol 대 customcontrol 대 stringbuilder

그러나 동일한 db 쿼리를 처리하고 동일한 HTML을 StringBuilder를 사용하여 출력하는 다른 페이지만큼 페이지가 로딩되지 않습니다. 그리고 나는 내 사이트가 잘 실행되기를 원하기 때문에/괜찮은 트래픽을 받으면 걱정이된다. 아직 어떤 벤치마킹도하지 않았지만 그 차이를 분명히 알 수 있습니다.

내 문제는 충분합니다. 내 질문에 '사용자 정의 컨트롤과 함께 LoadControl을 사용하는 것이 더 빠르지 만 쉽게 유지 관리 할 수있는 대안이 있습니까 (아니면 1 개 위치에서 atleast)?'

나는 생각했다 : (나는 그것을 해본 적이 없다이 일을 속도 않을 경우 100 % 모르겠지만)

  • 은 모두 StringBuilder 방법을 계속 넣어

    1. customcontrol 만들기 1 개 위치

    에서 제품을 유지하는 모든 생각을 죽겠다 내 기본 클래스

  • 의 CreateProduct 나는 정말 F를 듣고 싶습니다 그래서 너희들이 비슷한 상황의 선택이 있었다 희망 롬!

    [편집] 코드 [/ 편집] 내가 여기 excact UserControl을 코드가없는하지만 home..but 여기까지 단순화 된 아이디어 때이 게시물을 편집합니다 :

    1) 얻기 내 (내 DAL로 음속 2.2을 사용하여) 데이터베이스 결과

    DAL.ProductCollection coll = new DAL.ProductCollection(); 
    if(coll.count > 0) 
    { 
        foreach(DAL.Product item in coll) 
        { 
        Control p = LoadControl("FeaturedProduct.ascx"); 
        placeholder.Controls.Add(p); 
    
        //Set properties 
        p.title = item.Title; 
        p.img = GetImage(item.Guid); 
        ....etc 
        } 
    } 
    

    내에서 UserControl itselves은 3 리터럴 컨트롤과 한 이미지 컨트롤로 구성되어 있습니다.

    하지만 집에 도착하면 완전한 코드를 게시합니다! 감사합니다.

  • +0

    일부 html 출력을 게시 할 수 있습니까? 및 귀하의 제품'UserControl'? LoadControl()을 호출 할 때? – hunter

    답변

    2

    UserControl에서 Viewstate을 사용하지 않으셨습니까? StringBuilder을 사용하여 마크 업을 작성하는 경우 해당 마크 업에 대해 Viewstate이 앞뒤로 전송되지 않습니다. 기본 ASP 웹 컨트롤을 사용하는 경우 페이지로드 및 포스트 백 중에 앞뒤로 전송되는 Viewstate이 기본값이며 UserControl에서 사용되는 웹 컨트롤과 50-100 번 반복되는 웹 컨트롤에 따라 상당히 클 수 있습니다 .

    편집 : Viewstate이 문제가 아닌 경우 UserControl에 의해 생성 된 마크 업이 StringBuilder에서 생성하는 마크 업과 동일하거나 합리적으로 동일하다는 것을 확인 했습니까?

    또 다른 중요한 일은 서버 및 클라이언트 시간을 벤치마킹하는 것입니다. 마크 업이 다른 경우 클라이언트 렌더링 시간이 눈에 띄게 바뀔 수 있습니다. 서버 시간과 클라이언트 시간이 같거나 (또는 ​​미미한 경우) 서버 출력 및 전송 시간의 크기를 조사해야합니다.

    +0

    예, 대부분의 사이트에서 viewstate가 해제되어 있습니다. 그리고 그것은 정말로 느리지 만 확실히 stringbuilder보다 느립니다. 어쩌면 나는 편집증에 빠졌고 더 빠른 컴퓨터가 필요할지도 모른다. – Mark

    1

    UserControl은 사용자가하고있는 일에 대한 우수한 솔루션처럼 들립니다. 이 아이디어를 버리지 마십시오. 추상화는 세상을 돌아 다니게합니다.

    UserControl 마크를 표시하도록 요청했습니다. 또한이 코드를 모두 코드에 포함시키지 않으면 LoadControl()을 사용할 필요가 없습니다.

    2

    데이터베이스 쿼리 결과로 List<Product> 제품 목록이 있다고 가정 해 보겠습니다. Repeater 컨트롤을 해당 목록에 바인딩 한 다음 마크 업에서 Repeater 내에 UserControl을 추가 할 수 있습니다.

    class Product{ public string Sku{ get; set; } public string Name{ get; set; } } 
    

    마크 업 선언에서 :

    다음
    <asp:Repeater runat="server" ID="ProductsRepeater" > 
        <ItemTemplate> 
         <uc1:ProductsUserControl runat="server" ID="productsControl" Sku='<%# Eval("Sku")%>' Name='<%# Eval("Name") %>'/> 
        </ItemTemplate> 
    </asp:Repeater> 
    

    뒤에 코드 :

    protected void Page_Load(object sender, EventArgs 
    { 
        ProductsRepeater.DataSource = myProductsList; 
        ProductsRepeater.DataBind(); 
    } 
    

    1을 추가 할 것이다 그와 같이 여기

    클래스 제품과 더불어, 예제 제품 목록의 레코드 당 사용자 정의 컨트롤을 사용하고 Property 개체의 Sku 및 Name 속성을 각각의 pr에 바인딩합니다. 사용자 정의 컨트롤에 대한

    충분히 빠르지 않다면 어쩌면 사용자가 제어 할 수있는 부분이있을 것입니다.

    +0

    안녕하세요 그렉, 당신의 제안에 감사드립니다. 나는이 솔루션에 대해서도 생각해 왔지만 Repeater가 백그라운드에서 LoadControl을 사용한다고 생각한다. 나는 생각한다! 그러나 나는 확실히 그것을 감사 할 것이다. – Mark

    +0

    @Mark : 아마도, 나는 잘 모르겠다. 내가 찾은 것을 알려주지. – Greg

    1

    ASP.NET 서버 컨트롤을 사용하고 Render 메서드를 재정의합니다. 이 방법은 HtmlTextWriter을 사용하여 문자열 작성기에서와 같이 HTML 출력을 빌드 할 수 있다는 점에서 StringBuilder 솔루션과 더 유사합니다. 그러나 동시에 컨트롤 구조를 얻습니다.이 컨트롤 구조는 속성을 추가하고 상태를 관리하는 기능을 제공합니다. 그리고 서버 컨트롤이 컴파일되므로 일반적으로 사용자 정의 컨트롤보다 약간 나은 성능을 보입니다.

    또한 컨트롤 목록을 작성하는 데 사용되는 컨테이너 인 다른 서버 컨트롤을 만들 수도 있습니다. 이것이 훨씬 더 효과적 일지는 모르겠지만, 좋은 습관이고 코드를 재사용 및 유지하기가 더 쉬울 것입니다.