문제

요약

안녕하세요 여러분,
좋아, 맞춤형 컨트롤로 모험을 더 자세히 살펴보세요...

요약하자면, 여기서는 사용자 정의 컨트롤의 세 가지 주요 "클래스"에 대해 배웠습니다.이 중 잘못된 것이 있으면 언제든지 수정해 주세요!

  1. 사용자 컨트롤 - 다음에서 상속됨 사용자 컨트롤 그리고 다음 내에 포함되어 있습니다. ASCX 파일.이는 수행할 수 있는 작업이 상당히 제한되어 있지만 디자이너 지원을 통해 UI 공통성을 얻을 수 있는 빠르고 가벼운 방법입니다.
  2. 사용자 정의 복합 컨트롤 - 다음에서 상속된 컨트롤입니다. 웹컨트롤 여기서 기존 컨트롤을 컨트롤에 추가합니다. CreateChildControls 방법.이는 뛰어난 유연성을 제공하지만 추가 코딩 없이는 디자이너 지원이 부족합니다.DLL로 컴파일할 수 있기 때문에 이식성이 뛰어납니다.
  3. 사용자 정의 렌더링 컨트롤 - 사용자 정의 복합 컨트롤과 유사하게 웹 컨트롤 라이브러리 프로젝트에 추가됩니다.컨트롤의 렌더링은 프로그래머에 의해 완전히 제어됩니다. 세우다 방법.

내 생각..

좋습니다. 맞춤형 합성물을 가지고 놀면서 다음을 발견했습니다.

  • HTML 출력을 거의 제어할 수 없거나 제어할 수 없으므로 "디버깅"이 어렵습니다.
  • 그만큼 CreateChildControls (및 후속 방법)은 정말 바쁠 수 있습니다 컨트롤.추가(myControl) 어디에나.
  • 나는 테이블 렌더링(레이아웃이나 콘텐츠 등)이 상당히 어색하다는 것을 알았습니다.

질문..

그래서 나는 이것에 익숙하지 않기 때문에 위에서 언급한 몇 가지 요점으로 인해 기본에서 벗어날 수 있음을 인정합니다.

  • 복합재를 사용하시나요?
  • HTML 출력을 제어할 수 있는 멋진 트릭이 있나요?
  • 그냥 "젠장"이라고 말하고 계속해서 사용자 정의 렌더링 컨트롤을 만드시겠습니까?

나는 그것이 얼마나 많은지 알고 있기 때문에 내 마음 속에 정말로 확고히 자리 잡고 싶은 것입니다. 좋은 컨트롤 개발은 전체 개발 시간을 단축할 수 있습니다.

귀하의 답변을 기다리겠습니다 ^_^

도움이 되었습니까?

해결책

사용자 정의 렌더링 컨트롤을 사용해 보세요.대부분의 경우 합성은 UserControl에서 더 쉽게 수행하고 사용할 수 있지만, 그 이상에서는 자체 렌더링 전략을 활용하려면 더 미세한 수준의 제어가 필요합니다(의도하지 않은 말장난).

복합적인 장점을 가질 만큼 간단한 컨트롤(예: javascript/dhtml 기반 날짜 선택기와 결합된 텍스트 상자)이 있을 수 있지만 그 한 가지 예를 넘어서는 사용자 정의 렌더링 컨트롤이 더 나은 방법인 것처럼 보입니다.

다른 팁

사용자 정의 렌더링에 사용하는 또 다른 확장 방법은 다음과 같습니다.

 public static void WriteControls
        (this HtmlTextWriter o, string format, params object[] args)
 { 
    const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
    var controls  = new Dictionary<string,Control>();

    for(int i =0; i < args.Length; ++i)
    { 
       var c = args[i] as Control; 
       if (c==null) continue;
       var guid = Guid.NewGuid().ToString();
       controls[guid] = c;
       args[i] = delimiter+guid+delimiter;
    }

    var _strings = string.Format(format, args)
                         .Split(new string[]{delimiter},
                                StringSplitOptions.None);
    foreach(var s in _strings)
    { 
       if (controls.ContainsKey(s)) 
           controls[s].RenderControl(o);
       else 
           o.Write(s);
    }
}

그런 다음 RenderContents() 메서드에서 사용자 정의 합성을 렌더링하기 위해 다음과 같이 작성합니다.

protected override void RenderContents(HtmlTextWriter o)
{ 
    o.WriteControls
         (@"<table>
               <tr>
                    <td>{0}</td>
                    <td>{1}</td>
               </tr>
             </table>"
            ,Text
            ,control1);
 }

롭, 당신 말이 맞아요.제가 언급한 접근 방식은 일종의 하이브리드입니다.ascx 파일을 사용하는 것의 장점은 내가 본 모든 프로젝트에서 디자이너가 실제 마크업을 편집하는 데 가장 편안함을 느낄 것이며 ascx를 사용하면 디자이너와 별도로 작업할 수 있다는 것입니다.나중에 컨트롤 자체에 대한 실제 CSS/마크업/디자인 변경을 계획하지 않는 경우 사용자 정의 렌더링 컨트롤을 사용할 수 있습니다.내가 말했듯이 내 접근 방식은 더 복잡한 시나리오에만 관련됩니다(그리고 아마도 디자이너가 필요한 경우일 것입니다 :))

나는 종종 복합 컨트롤을 사용합니다.Render 또는 RenderContents를 재정의하는 대신 각 컨트롤에 CssClass를 할당하고 스타일시트를 사용하세요.여러 Controls.Add의 경우 확장 메서드를 사용합니다.

//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
 { foreach(Control control in controls) coll.Add(control);
 }

빠르고 더러운 렌더링을 위해 다음과 같은 것을 사용합니다.

writer.Render(@"<table>
                   <tr><td>{0}</td></tr>
                   <tr>
                       <td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");

컨트롤 속성을 초기화하기 위해 속성 초기화 구문을 사용합니다.

childControl = new Control {  ID="Foo"
                            , CssClass="class1"
                            , CausesValidation=true;
                           };

사용자 정의 복합 컨트롤을 사용하면 대규모 웹 애플리케이션이 있고 여러 위치에서 큰 청크를 재사용하려는 상황이 있습니다.그런 다음 반복하는 대신 개발 중인 컨트롤의 하위 컨트롤만 추가합니다.최근에 수행한 대규모 프로젝트에서 우리가 수행한 작업은 다음과 같습니다.

  • 모든 복합 컨트롤에는 컨테이너가 있습니다.컨트롤 내부의 모든 항목에 대한 래핑으로 사용됩니다.
  • 모든 복합 컨트롤에는 템플릿이 있습니다.템플릿에 대한 마크업만 포함하는 ascx 파일(<%Control%> 지시문 없음)입니다.
  • 컨테이너(그 자체로 컨트롤임)는 템플릿에서 초기화됩니다.
  • 컨테이너는 템플릿의 다른 모든 컨트롤에 대한 속성을 노출합니다.
  • 복합 컨트롤에서는 this.Controls.Add([the_container])만 사용합니다.

실제로 지정된 템플릿을 사용하여 컨테이너를 초기화하고 템플릿에서 컨트롤을 찾을 수 없을 때 예외를 발생시키는 기본 클래스가 필요합니다.물론 이는 소규모 애플리케이션에서는 과잉일 가능성이 높습니다.코드와 마크업을 재사용하지 않고 간단한 컨트롤만 작성하려는 경우 사용자 컨트롤을 사용하는 것이 더 좋습니다.

이 기술을 사용하면 디자인 타임을 더 쉽게 만들 수 있습니다.

http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

기본적으로 LoadControl 메서드를 사용하여 런타임에 사용자 정의 컨트롤의 인스턴스를 만든 다음 이를 일종의 statebag에 전달한 다음 컨트롤 트리에 연결합니다.따라서 복합 컨트롤은 실제로 더 많은 컨트롤러처럼 작동하고 .ascx 파일은 뷰와 비슷합니다.

이렇게 하면 전체 컨트롤 트리를 인스턴스화하고 C#에서 컨트롤 스타일을 지정해야 하는 수고를 덜 수 있습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top