2012-03-08 3 views
1

ascx 컨트롤이 있습니다. 다른 컨트롤 내부asp : dropdownlist는 page_load에서 null입니다.

protected void Page_Load(object sender, EventArgs e) 
     { 
      Languages = GetSiteLanguagesService(); 
      if (Languages.Count > 1) 
      { 

       //null reference exception here!! languageDropdown is null! 
       LanguageDropdown.Visible = true; 
       LanguageDropdown.DataTextField = "DisplayName"; 
       LanguageDropdown.DataValueField = "LangUrl"; 
       LanguageDropdown.DataSource = Languages ; 
       LanguageDropdown.DataBind(); 
      } 
     } 

:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LanguageSelect.ascx.cs" Inherits="MyNamespace.LanguageSelect" %> 

뒤에 코드

내가 LanguageSelect의를 Page_Load에 명중 디버거와

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SomePage.ascx.cs" Inherits="myNamespace.SomePage" %> 
<div id="main" role="main"> 
    <myTag:LanguageSelect id="langSelect" runat="server" /> 
    <div class="section columns"> 
     <div class="main-column"> .... 

하지만, 드롭 다운은 null입니다 ! 만약 내가 드롭 다운 컨트롤을 마크 업에 추가한다면, 나는 그것이 항상 존재해야한다고 생각한다.이 경우 그것은 단지 동적 인 것처럼 행동한다.

이제 SomePage가 html로 렌더링되고있다. ,하지만 myTag에있는이 하나는 전혀 렌더링되지 않습니다. div에서 드롭 다운 목록을 감싸는 것이 중요하지 않습니다. div도 렌더링되지 않습니다 !! 내가 SomePage를 Page_Load에서 중단 점을 넣으면

의 langSelect 제어가 (NOT NULL)이 될 것이다, 그러나 자체는

+0

UserControl이 페이지에 동적으로 추가 되었습니까? 왜냐하면 사람들은 때때로 생성자를 사용하는 대신'Page.LoadControl'을 통해 인스턴스를 만들어야한다는 사실을 잊어 버리기 때문입니다. Side-Note : 페이지 이벤트를 사용하여 UserControl을 암시 적으로 초기화하는 것은 거의 항상 나쁜 생각입니다. 대신 컨트롤러 (보통 페이지)는 컨트롤을 직접 초기화해야합니다 (예 :'BindData' 또는'Init' 메소드 호출). 그렇지 않으면 라이프 사이클 문제와 예기치 않은 동작이 발생할 수 있습니다. –

+0

@TimSchmelter 아니요, 동적으로 추가되지 않습니다. 음 ... 컨트롤이 마크 업으로 추가되는 경우 동적 인 것이 아닙니다. – lurscher

답변

0

마지막으로, 문제를 파악했습니다. 컨트롤이 다른 컨트롤에 포함 된 경우 ASP.

protected void Page_Load(object sender, EventArgs e) 
     { 
      Languages = GetSiteLanguagesService(); 
      if (Languages.Count > 1) 
      { 

       LanguageDropdown = new DropDownList(); //allocate the control 
       LanguageDropdown.Visible = true; 
       LanguageDropdown.DataTextField = "DisplayName"; 
       LanguageDropdown.DataValueField = "LangUrl"; 
       LanguageDropdown.DataSource = Languages ; 
       LanguageDropdown.DataBind(); 
      } 
     } 

하고, 재정의를 추가 : NET은

나는 기본적으로 컨트롤을 할당하여 Page_Load에 만든 다음 변경했다 (자동 하위 컨트롤을 렌더링하지 않습니다) 렌더링을 무시한다고 가정 OnRender 처리기의 경우 :

protected override void Render(HtmlTextWriter writer) 
     { 
      base.Render(writer); 
      LanguageDropdown.RenderControl(writer); 
     } 

이렇게하면 컨트롤이 완벽하게 렌더링됩니다!

+0

"다른 컨트롤에서 컨트롤이 상속 될 때" 컨트롤이 다른 컨트롤에 포함 된 경우 "가 아닙니다. 그들은 완전히 다른 두 가지입니다. – outlookrperson

+0

@rperson 나는 이해하지 못한다. 'LangSelect'는 SomePage를 상속받지 않습니다. – lurscher

5
  1. 당신의 UserControl을 페이지에 동적으로 추가되어 널 LanguageDropdown이있다? 왜냐하면 사람들은 때로는 생성자를 사용하는 대신 Page.LoadControl을 통해 인스턴스를 만들어야한다는 것을 잊어 버리기 때문입니다.
  2. UserControl을 페이지에 등록 했습니까? 예를 들어

:

<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %> 

사이드 노트 : 그것은 거의 항상 묵시적으로 UserControl을 inititialize 페이지 이벤트를 사용하는 것은 좋은 생각입니다. 대신 컨트롤러 (보통 페이지)는 컨트롤을 직접 초기화해야합니다 (BindData 또는 Init과 같은 메서드 호출). 그렇지 않으면 수명주기 문제 또는 불쾌한 오류가 발생할 수 있습니다.

+0

음, 사용자 정의 컨트롤 자체가 sitecore 하위 레이아웃 – lurscher

+0

입니다. 귀찮게하는 것은 컨트롤이 동적 인 지 (또는 그렇지 않은지) 중요하지 않다는 것입니다. LanguageDropdown을 할당하고 페이지에 추가하려고하면 로드, 초기화, 렌더링 이벤트 페이지를 수정할 수 없기 때문에 오류가 발생합니다. – lurscher

1

자동 생성 된 ".ascx.designer.cs"파일을 삭제하고 다시 생성 해보십시오. .. 이렇게하려면 다음과 같이하십시오 *

  • 가의 .ascx을 삭제 designer.cs
  • ASCX 파일을 마우스 오른쪽 단추로 클릭하고 지금

디자이너 "웹 응용 프로그램으로 변환" .cs 파일이 다시 작성됩니다. 상황이 지금 제대로 작동하는지 확인하십시오.

+0

이 작동하지 않으며 designer.cs가 마크 업과 동기화 된 것처럼 보입니다. – lurscher

1

UserControl (.ascx)을 CustomControl (아니요 .ascx)으로로드하려고 시도했을 수 있습니다. 페이지 및 web.config 페이지/컨트롤 섹션에서 .ascx 경로 대신 LanguageSelect의 네임 스페이스에 대한 참조를 확인하십시오.

관련 문제