2009-04-03 1 views
5

컨트롤을 "이동"하는 수락 된 방법이 있습니까?런타임시 ASP.Net 컨트롤을 웹 양식의 다른 위치로 어떻게 이동할 수 있습니까?

고객이 페이지의 여러 위치 중 하나에 마크 업 (일부 시각적 요소 표시)을 배치하려고합니다. 위치는 CSS에 변경 사항을 적용 할 수없는 지점과 다릅니다 (부동 상태 등).

Visible이 "false"로 설정된 여러 지점에 컨트롤을 넣은 다음 특정 페이지에 대해 원하는 위치에 컨트롤을 표시하는 것으로 생각했습니다.

그러나이 컨트롤의 코드는 간단하지 않습니다. 예를 들어 두 개의 템플릿 섹션이 있습니다. 이것을 여러 곳에서 속이는 것은 다루기 힘들 수 있습니다. 또한 같은 이유로 코드 숨김에서이 ​​컨트롤을 엄격하게 사용하고 싶지 않습니다.

그래서 웹 양식의 한 곳에 넣고 싶습니다. 원하는 곳을 기준으로 이동하십시오. 자리 표시자를 다른 지점에 배치하고 한 지점에 컨트롤을 놓은 다음 제거하고 올바른 지점에 추가 할 수 있습니까? 나는 이것이 효과가있을 것이라고 생각한다.

누군가 더 좋은 생각이 있습니까? 이것에 대한 모범 사례가 있습니까?

답변

5

내가 자리 표시 자 컨트롤을 사용하여 별도의 사용자 컨트롤에 마크 업을 이동 한 후 런타임에이를로드하고 해당 자리에 추가하는 것이 좋습니다 것입니다.

예 :

// Load a user control 
MyControl userCtrl = (MyControl) LoadControl("~/Controls/MyControl.ascx"); 

// Or create an instance of your control 
SubclassedControl subclassedCtrl = new SubclassedControl(); 

// Do stuff with controls here 
userCtrl.LoadData(); 
subclassedCtrl.Text = "Hello World"; 

// Check which placeholder to add controls to 
PlaceHolder placeHolder = (foo=="bar") ? placeHolder1 : placeHolder2; 

// Add the controls 
placeHolder.Controls.Add(userCtrl); 
placeHolder.Controls.Add(subclassedCtrl); 

이 불필요한 마크 업 페이지를 어지럽히고 방지하며, 다른 개발자가 코드를 확인 및 제어가 한 곳에서 이유를 즉시 볼 수없는 경우 런타임에로드하는 것도, 나중에 불필요한 혼란을 피할 수 마크 업에서는 완전히 다른 부분에 렌더링됩니다.

+0

컨트롤이 표준 ASP.Net 컨트롤의 확장이고 App_Code에 .cs 파일로 존재하는 경우 어떻게합니까? 이 파일을 사용자 정의 컨트롤 (.ascx 파일)에 "포장"해야합니까? – Deane

+0

예, 자리 표시 자 또는 패널에로드 할 수 있습니다. 동일한 diff는 자리 표시자가없는 div 또는 span 태그 만 패널에 표시합니다. – madcolor

+0

표준 ASP.NET 컨트롤을 서브 클래 싱하는 경우 컨트롤을로드하는 대신 컨트롤의 인스턴스를 만든 다음 개체 틀에 추가 할 수 있습니다. 이를 반영하기 위해 위 코드 샘플을 업데이트했습니다. – Mun

2

웹 파트가 원하는 작업을 수행합니까?

또는 컨트롤을 프로그래밍 방식으로 변경하여 컨트롤을 별도의 영역으로 이동할 수 있습니다.

0

미리 정의 된 위치에 패널을 배치하고 런타임에 특정 패널에 컨트롤을 추가 할 수 있습니다. 다음은 레이블을 추가하는 예제입니다 (레이블은 모든 컨트롤로 대체 될 수 있음).

"또한, 나는 같은 이유로 코드 숨김에서 엄격이 컨트롤과 을 일해야하고 싶지 않아요."지금까지와 같은

Dim lblDisplay As Label = New Label() 
lblDisplay.ID = "myLabel" 
lblDisplay.Text = "Some Text" 
pnlDisplay.Controls.Add(lblDisplay) 

...

나는 코드 뒤에서 대부분의 작업을해야한다고 생각합니다.

PS는 ... 전체 UserControl을 설정의 좋은 예는 http://www.asp.net/downloads/starter-kits/time-tracker/

+0

나는 코드 숨김에서 생성하고 싶지 않다는 것을 의미했다. 필자는 코드 숨김에서 어떤 형태로 그것을 조작하는 데 문제가 없지만, 그 대부분을 웹 양식에 표시하고 싶습니다. – Deane

+0

나는 당신이 얻을 수/설정하고 패널을로드 할 수있는 속성을 가진 마크 업으로 사용자 정의 컨트롤을 만들 것을 제안합니다. 마크 업을 볼 수있는 웹폼에 앉을 충분한 이유가 없습니다. – madcolor

1

당신은 렌더링 방식을 무시하고 당신이 HTML에서 원하는 목적지 컨트롤을 배치 할 수 있습니다 .. 여기에서 다운로드 할 수 있습니다.

컨트롤은 서버에서 상호 작용해야하는 Controls 컬렉션에만 추가하면됩니다. 나머지 HTML은 응답 스트림에 기록 될 수 있습니다. Render를 오버라이드하면 어쨌든 컨트롤을 임의의 순서로 배치하여 html을 만들 수 있습니다.

다음은 html을 작성하는 방법의 예입니다.

protected override void Render(HtmlTextWriter writer) 
{ 
    AddAttributesToRender(writer); 
    writer.RenderBeginTag(TagKey); 

    writer.RenderBeginTag(HtmlTextWriterTag.Div); 
    _control.RenderControl(writer); 
    writer.RenderEndTag(); 

    writer.RenderEndTag(); 
} 
3

자바 스크립트와 DOM을 통해 다른 방법을 시도해 보았습니다. 숨겨진 div 태그 안에 컨트롤을 렌더링하십시오. 그래서 당신은 여기에 콘텐츠를 렌더링 것 : 그런 다음

<div id='rendercontent' style='display:none'> 
    .. control here .. 
</div> 

, 여기에 모든 이동하고 싶었 말할 수 (스팬 태그 내부에 그것이 우리가 대체하려고하는지 때문에) :

<div id='newlocation1'><span></span></div> 

다음과 같은 자바 스크립트 정의 할 :

<script language="JavaScript"> 
function replaceNode(newElementID, targetElementID) 
{ 
    var targetElement=document.getElementById(targetElementID); 
    var newElement=document.getElementById(newElementID); 
    targetElement.replaceChild(newElement, targetElement.firstChild); 
} 
</script> 

을 그리고 당신은 새 위치로 컨텐츠를 이동하고자 할 때, 전화 :

<script language="JavaScript"> 
replaceNode('rendercontent','newlocation1'); 
</script> 
관련 문제