2011-03-18 4 views
0

대시 보드 페이지에서 여러 컨트롤을 동적으로로드합니다. 컨트롤은 항상로드되어야하므로 if (!Page.IsPostBack) 코드가 없습니다. 그러나 문제는 코드 숨김에서 우리는 Request.Form.GetValues을 사용하고 특정 드롭 다운 필드의 값은 항상 null입니다 (아마도 컨트롤이 다시 게시되고 포스트 백에 다시로드되기 때문에) 나중에 페이지에서 오류가 트리거됩니다 이 드롭 다운에서 값을 기대합니다. Javascript를 통해 동적으로 페이지를 추가 할 수 있기 때문에 Request.Form.GetValues를 사용해야한다.동적으로 컨트롤 및 포스트 백로드

포스트 백을 확인하면 컨트롤의 버튼 이벤트가 전혀 실행되지 않지만 대신 대시 보드 페이지가 다시로드되고 컨트롤이로드되지 않습니다 (즉, 페이지가 비어 있음).

이 문제를 해결하려면 어떻게합니까? 항상 동적으로 컨트롤을로드해야하지만 Request.Form.GetValues를 통해 값을 검색해야합니다. 어떤 제안?

편집 여기

코드가 어떻게 표시되는지를 보여줍니다 대략 같은 :

(클라이언트 측 HTML)

는 는 는 ibtnGetQuote_Click

(서버 측

<table> 
    <tr> 
     <td align="center"> 
      <select id="Class1" class="txtboxcomm" name="Class1" runat="server" /> 
      <a href="javascript:classFinder('1')">&nbsp;Look Up</a> 
     </td> 
    </tr>  
</table> 
<div id="action"> 
    <asp:LinkButton ID="ibtnGetQuote" runat="server" OnClick="ibtnGetQuote_Click" CssClass="getQuote" AccessKey="G">Get Quote</asp:LinkButton> 
</div> 
-이 실제로 루프 사용자가 여러 행을 추가 할 수 있으므로 정확한 행을 찾기 위해 "클래스"라는 단어에 "i"가 추가됩니다.

IList<string> classes = this.GetFormValues("Class1"); 

// This will return null all the time... 
private IList<string> GetFormValues(string clientID) 
{ 
    String[] values; 
    values = Request.Form.GetValues(clientID); 
    if (values == null) 
    { 
     Control ctl = FindControl(clientID); // uses built-in FindControl method 
     values = Request.Form.GetValues(ctl.ClientID); 
    } 
    return values; 
} 

"ctl00 $ xx $ xx"원본 코드가 하드 코드되었지만 컨트롤이로드 될 수도 있고로드되지 않을 수도 있으므로 컨트롤이 가져올 이름을 보장 할 수 없습니다. 실제로 첫 번째 컨트롤 만 서버 컨트롤이므로 나머지는 표준 HTML 컨트롤이므로 "ClientID"가 없으므로 모든 시나리오에서 작동하는지 확실하지 않습니다.

+0

당신의 표현은 많은 컨트롤 중 하나에서만이 문제가 발생한다는 인상을줍니다. 맞습니까? 아니면 모든 동적 컨트롤에 이러한 문제가 있습니까? –

+0

null 값까지는 첫 번째 행이 실제 서버 컨트롤 (예 : ASP.NET ctl00_ $ Stuff_ $ Stuff 형식 이름 지정)이고 Request.Form .GetValues는 해당 컨트롤에 대해 null을 반환합니다. –

답변

0

로드 이벤트에서 컨트롤을로드하는 것 같습니다. 뷰 타임이 이미 처리되었으므로 너무 늦었습니다. Init 이벤트에서 컨트롤을로드해야합니다.

+0

컨트롤은 OnInit에 동적으로로드되지만 Page_Load의 일부 기본값으로 초기화됩니다. –

+0

작은 샘플을 게시 할 수 있습니까, 하나의 동적 컨트롤 (예 : 드롭 다운) 일 수도 있습니다. –

+0

일부 코드를 게시했습니다. –

0

가능한 한 빨리 컨트롤을 열어 컨트롤 트리에 추가하는 것이 좋습니다. LoadViewState 메서드가 실행되기 전에이 작업을 수행 할 수 있으면 컨트롤은 정적으로 선언 된 컨트롤처럼 뷰 상태를 처리해야합니다.

+0

그 시점은 언제입니까? OnInit과 InitComplete를 시도했지만 그 값은 여전히 ​​Request.Form.GetValues에서 null로 되돌아옵니다. –

0

CreateChildControls 이벤트에서 컨트롤 만들기 및 채우기를 수행하십시오. 양식을 확인하기 전에 EnsureChildControls()를 호출하십시오.

+0

시도해 보았습니다. 사용자 지정 메서드 초기화 컨트롤이 실행되지 않고 필요한 기본 값 (드롭 다운 옵션 등)이 설정되어 있지 않습니다. Init는 Page_Load에서 호출됩니다. 다른 곳에서해야합니까? –

+0

어 ..예, CreateChildControls에 있어야합니다. –

관련 문제