2011-02-07 7 views
8

사용자가 고객 연락처 정보를 입력해야하는 웹 페이지가 있습니다. 0에서 무한 수의 연락처로 입력 할 수 있습니다. viewstate가이 모두를 저장 처리 할 수 ​​있기 때문에컨트롤 목록에 컨트롤을 동적으로 추가하기

public void btnAddContact_Click(object sender, EventArgs e) 
    { 
     IList<CustomerContactProfile> customerContacts = new List<CustomerContactProfile>(); 
     if (ViewState["CustomerContactList"] != null) 
      customerContacts = (List<CustomerContactProfile>)ViewState["CustomerContactList"]; 
     CustomerContactProfile contactProfile = (CustomerContactProfile)LoadControl("~/Controls/Embedded/CustomerContactProfile.ascx"); 
     customerContacts.Add(contactProfile); 

     foreach (CustomerContactProfile contact in customerContacts) 
      phCustomerContacts.Controls.Add(contact); 

     ViewState["CustomerContactList"] = customerContacts; 
    } 

이 코드는 작동하지 않습니다 :이 추가 뒤에 내 코드에서

<ajaxToolkit:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="ScriptManager1" /> 
<asp:PlaceHolder ID="phCustomerContacts" runat="server" EnableViewState="true">/asp:PlaceHolder> 
<asp:LinkButton ID="btnAddContact" runat="server" OnClick="btnAddContact_Click" CssClass="LinkButton" Text="Add Contact"/> 

:

나는 페이지의 페이지 코드를 생성 그 제어 데이터. 그러나 이미 추가 된 컨트롤을 저장하는 다른 방법을 생각할 수 없습니다.

asp:PlaceHolder 컨트롤의 viewstate는 아무 것도 저장하지 않고 사용자가 일부 컨트롤에 컨트롤을 추가하여 두 번째 컨트롤을 추가 할 때 데이터가 손실되지 않도록 컨트롤을 저장해야합니다. 곧.

+1

Viewstate에 있어야하는 특별한 이유가 있습니까? 대신 Session을 시도 할 수 있습니다. – asawyer

+0

세션은 괜찮지 만 사용자가 페이지를 떠날 경우 세션을 채우지 않을까요? –

+1

세션은 페이지 기반 상태를위한 장소가 아닙니다. 하나는 사용자가 별도의 조치를 취하지 않으면 사용자가 두 페이지를 두 개의 개별 창에서 볼 수 없음을 의미합니다. 대부분의 웹 앱에서 가능해야합니다. –

답변

1

전체 컨트롤을 저장하는 대신 기본 데이터를 세션에 저장하고 페이지를 다시로드 할 때마다 해당 데이터에서 컨트롤 집합을 다시 작성하기 만하면됩니다.

+0

변경중인 컨트롤의 데이터를 어떻게 처리합니까? 예를 들어 컨트롤에는 텍스트 상자가 있습니다. 텍스트 상자 값이 변경되고 페이지가 다시로드되면 변경된 값은 세션의 기본 데이터로 바뀝니다. – PTuckley

0

연락처를 동적으로 추가하는 것이 가장 좋은 방법인지 잘 모르겠습니다. jquery를 통해 컨트롤을 만들고 웹 메서드로 데이터를 보내면 좋을까요?

+0

을 사용하여 데이터베이스에 저장됩니다. 아마도 jquery가 더 좋습니다. 나는 그것을 사용한 적이 한번도 없다. –

0

대신 viewstate에 컨트롤 수를 저장하여 추가하는 것이 좋을 것입니다. 그런 다음 페이지 초기화 또는 PreInit에 추가하십시오. 그러면 ViewState가 각 동적 컨트롤에 대해 유지됩니다. 이것은 버튼 클릭 후 포스트 백을위한 것입니다.

HTH.

+0

@ 브레인 - 양식의 모든 정보를 잃어 버리는 것을 제외하고는 효과가 있습니다. –

+0

init 또는 preinit에서 컨트롤을 다시 추가하는 한 viewstate는 변경된 정보를 유지하지 않습니다. –

0

사용자가 뷰 상태에 입력 한 컨트롤의 수를 저장하십시오. LoadViewState 페이지 메서드를 재정의하고 거기에 컨트롤 수를 다시 추가하십시오. 프레임 워크는 게시 된 데이터를 컨트롤로 다시로드하는 작업을 처리합니다. 당신은 정보를 잃지 않을 것입니다. viewstate가 복원되기 전에 컨트롤을 추가했는지 확인해야합니다.

0

Viewstate 대신 Session에 저장하십시오. 그것은 나쁘지 만 작동 할 것입니다!

0

저는이 점에 대해 Viewstate, Session 또는 기타 다른 임시 저장소에 의존해서는 안됩니다.

일반적으로 클래스를 사용하는 것처럼 .ascx를 사용하는 것처럼 보입니다. HTML 컨트롤이 많기 때문에 사용자 컨트롤이 더 커질 것입니다 (?).

어쨌든, 클래스의 일반적인 목록은 최소한 작을 것입니다.

하지만 그렇지 않은 경우, 내가 선호하는 방법은 완료 될 때 각 레코드를 데이터베이스에 삽입하는 것입니다. 적어도 수동 입력의 경우, 이는 작업하고있는 것에 대한 제 느낌입니다. 예를 들어, listview, detailsview, gridview 등을 사용합니다.

관련 문제