2012-02-09 3 views
0

Textboxes and DropDownLists과 같은 많은 컨트롤이있는 패널 (pnlPanel)이 있습니다. 사용자가 페이지로 돌아 가면 페이지를 영구히 유지하기를 원하므로 다음을 시도해 보았습니다.Session 객체에 webControls 저장

/*i have saved the panel like this 
    Session["testPanel"] = pnlTest; 
*/ 

protected void Page_Load(object sender, EventArgs e) 
{  
    if (Session["testPanel"] != null) 
    { 
     panel = Session["testPanel"] as Panel; 
    } 
} 

하지만 작동하지 않습니다. 가능한가? 이유는 내가 오버 헤드가 문제가 아니기 때문에 나는 이것을하고 싶다. 나는 코딩 시간을 줄이고 싶다.

+0

당신은'panel = (Panel) Session [ "testPanel"];'시도한 적이 있습니까? 또한, 당신의 표현은 에러를 발생시킬'Session [ "panel"]'을 말합니다. –

+0

ASP.NET 사용자 정의 컨트롤 캐싱을 고려해보십시오. 패널 코드를 사용자 정의 컨트롤로 이동하면 렌더링 된 내용을 쉽게 캐시 할 수 있습니다. http://stackoverflow.com/questions/880937/vary-by-control-properties-using-partialcaching-in-asp-net – Zachary

+0

패널에는 텍스트 상자와 드롭 다운 목록이 있습니다. – Lautaro

답변

0

이와 같은 작업을 수행하는 이유를 모른 채 출력 캐싱 지시문을 살펴 봐야합니다. 콘텐츠를 패널에서 사용자 정의 컨트롤로 가져 와서 가장 효과적 일 수 있습니다. 그런 다음 VaryByCustom을 사용하여 컨트롤에 출력 캐싱을 설정하여 사용자 이름이나 다른 고유 한 식별자를 사용하여 사용자별로 구분할 수 있습니다. 당신이 webfarm 시나리오에있는 경우 세션 및/또는 캐싱을 사용

http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspxhttp://msdn.microsoft.com/en-us/library/system.web.httpapplication.getvarybycustomstring.aspx

문제가 될 것입니다. 캐시는 응용 프로그램 인스턴스에 적용되므로 웹 팜의 다른 서버는 액세스하지 못합니다.

다른 부작용에는 viewstate 관련 문제가 포함됩니다.

1

본인은 본 적이 없지만 일반적으로 나쁘다고 생각합니다. 그것을 테스트하지 않고, 내 생각 엔이 ViewState 문제의 톤을 생성 할 것입니다. ViewState를 유지 관리 할 수 ​​있다고하더라도 여러 페이지로드에 대해이 컨트롤을 유지하려고 시도하는 것이 좋을 것입니다.

내가 추천하는 것은 패널의 속성을 보유하는 공통 개체를 사용하고 초기 이벤트 중 하나에 메서드를 작성하여 이러한 속성으로 새 패널을 미리 채울 수 있습니다. 이 방법에서

0

첫 번째 방법


protected void Page_Load(object sender, EventArgs e) 
{  
    if (ViewState["panel"] != null) 
    { 
     panel = ViewState["panel"] as Panel; 
    } 
} 

당신의 ViewState 개체는 달랐다. ViewState["panel"]가 제어 메모리를 제공하고 객체가 세션이 Session["panel"]


두 번째 방법


저장 것을 인상에 액세스하는 후에는 일부 null 값을 받고있을 수 있습니다 전체 패널 HTML을 데이터베이스에 저장하고 아래의 기능을 유지하여 양식로드 에 액세스하십시오.

이제 접근법의 연속성 - 2 세션 개체에 값을 할당하십시오.

this.Controls.Add(new LiteralControl("Your HTML")); 

당신은 파일 시스템을 사용할 수 있습니다


세 번째 방법.div 파일을 파일에 저장하고 런타임에 파일에 액세스하십시오.

희망이 도움이 될 수 있습니다.


편집 - 두 번째 접근법 1 => 추가 코드는

+0

작동하지 않습니다. 가져 오는 중 : 'System.Web, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'어셈블리의 'System.Web.UI.WebControls.Panel'형식이 serializable로 표시되어 있지 않습니다. – Lautaro

+0

질문에 코드를 공유 할 수 있습니까? – Pankaj

+0

보호 보이드를 Page_Load (객체 송신자있는 EventArgs E) { 경우 (ViewState를 [ "testPanel"] = NULL!) { pnlTest = (패널)의 ViewState [ "testPanel"]; } } 보호 공극 button_Click (객체 송신자있는 EventArgs E) { 의 ViewState [ "testPanel"] = pnlTest; label.Text = "저장 됨 :"+ ViewState [ "testPanel"]. ToString(); } – Lautaro

0

당신이 여기서 뭘하려고하면 패널을 캐시하는 것입니다하지만이 방법이 아니다. 패널을 저장할 때 패널은 메모리상의 실행중인 개체이므로 그대로 저장할 수 없습니다. html 문자열로 변환하고이 문자열을 저장하고 캐시해야합니다. 따라서 Panel 근처에서 리터럴을 배치 한 다음 Panel을 렌더링하고 세션에 저장하면 실제로이 렌더링의 텍스트가 표시됩니다.

if(Session["testPanel"] == null) 
{ 
    TextWriter stringWriter = new StringWriter(); 
    HtmlTextWriter renderOnMe = new HtmlTextWriter(stringWriter); 
    // render and get the actually html of this dom tree 
    testPanel.RenderControl(renderOnMe); 
    // save it as cache 
    Session["testPanel"] = stringWriter.ToString();  
} 
// render the result on a literal 
cLiteralID.Text = Session["testPanel"]; 
// hide the panel because I have render it on literal. 
testPanel.Visible = false; 

일부 테스트가 필요합니다. 나는 사용자 정의 컨트롤과 사용자 정의 캐시에 대해 비슷한 코드를 사용하며,이 양의 데이터를 절대로 저장하지 않습니다.

관련 문제