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