2010-07-21 3 views
3

사용자를 여러 단계로 안내하기 위해 UI를 만들어야하는 경우가 있습니다. 하나는 사용할 수있는 두 가지 일반적인 디자인이 있습니다. 하나의 옵션은 각 단계를 별도의 페이지로 만드는 것입니다. 또 다른 옵션은 asp : panels 또는 multiview 컨트롤을 사용하고 asp.net 페이지 하나 안에 모든 코드를 유지하는 것입니다.ASP.NET 패널/멀티보기 대 별도 페이지 사용 지침

별도의 페이지 접근 방식을 사용할 때마다 페이지 간 데이터 공유가 불안정합니다.

멀티 뷰 방식을 사용할 때마다 코드 숨김 논리가 응집력을 잃어 버렸습니다. 한 번에 너무 많은 항목을 다루고 있으며 따르기가 어렵습니다.

어떤 방법을 사용할 것인지 결정할 때 어떤 기준을 사용합니까?

기존 옵션에서 발견 할 수있는 한계점을 해결할 수있는 다른 디자인 패턴이 있습니까?

답변

0

전체 솔루션이 아니더라도 asp.net에 Wizard 옵션이 있습니다.

6

저는 Webforms에서 교차 페이지 포스트 백을 좋아하지 않으며 MultiViews를 사용할 때 마크 업과 코드 숨김이 제어 불능에서 빠르게 나선형을 탈 수 있다는 것에 동의합니다.

각 단계가 별도의 사용자 정의 컨트롤로 캡슐화되었지만 현명한 절충안은 MultiView가 될 수 있습니다. 그렇게하면 다시 게시 모델과 맞서 싸울 필요가 없으며 합리적인 수준의 코드 분리를 얻을 수 있습니다.

+3

코드 숨김이 나선형으로 제어 할 필요가 없습니다. 부분 클래스를 사용하는 경우 다른 뷰의 코드를 다른 파일로 쉽게 분리 할 수 ​​있습니다. – Justin

+2

참이고 partial이 아닌 #region 블록을 사용하여 동일한 인수를 사용할 수도 있습니다. 물론 개인적인 선호도는 떨어지지 만 두 가지 방법 모두를 사용하여 큰 클래스를 가능한 냄새로 구성하는 것이 좋습니다. – richeym

0

클래식 ASP.NET WebForms에서 각 페이지마다 패널을 사용하는 것이 가장 좋은 방법이라는 것을 알았습니다. 마스터 페이지를 사용하고 있다고 가정합니다.

void ShowPanel(Panel panel) 
{ 
    firstPagePanel.Visible = false; 
    secondPagePanel.Visible = false; 
    ... 
    lastPagePanel.Visible = false; 

    panel.Visible = true; 
} 

콜링 하나의 패널이 한 번에 볼 수 있다는 것을 의미 그래서 난 그냥 치료 :

, 나는 이런 식으로 뭔가를 사용하는 간단한 패널 (사용자의 관점에서 페이지)의 처리를 유지하려면 각 패널은 별도의 페이지로 구성됩니다. 원하는 경우 페이지 내부 패널을 사용할 수 있으며 ShowPanel 메소드에서 해당 패널을 유지할 수 있습니다.

코드 숨김 논리는 버튼 클릭, 드롭 다운 변경 또는 기타와 같이 한 번에 하나의 이벤트 처리기 만 처리합니다. 이 핸들러들 각각에서 제일 먼저하는 일은 ShowPanel(theRightPanel);입니다. 그러면 다른 모든 패널들이 사라지고 내가 원하는 동작과 관련된 패널 (프로세스의 다음 페이지 보여주기)이 표시됩니다. 마지막 이벤트가 새 페이지로 이동하는 경우 이벤트 처리기 내에서 해당 페이지의 데이터를 채 웁니다. 원하는 경우 페이지 별 이벤트 핸들러를 여기에 연결할 수도 있습니다.

필자는 ViewState를 직접 사용하지 않는 (사용하지 않도록 설정하는) 경향이 있으며, 처리중인 핸들러에 대해 표시되지 않는 패널의 컨트롤을 참조하지 않도록합니다. Session 변수에서 데이터를 전달하거나 현재 양식의 숨겨진 입력을 통해 전달하고 다음 페이지에서 다시 게시 값으로 처리하는 것을 선호합니다. 양식에 숨겨진 입력을 동적으로 추가하여 정적 마크 업에 나타나지 않아도됩니다. 이를 통해 기능을보다 잘 캡슐화하고 웹에서 실제로 일어나고있는 일과 더욱 밀접하게 일할 수 있습니다.

기본적으로 나는 페이지에서 POST와 같은 이벤트 핸들러를 다루고 있습니다.

마지막으로 부분 클래스를 사용하면 코드 숨김 코드를 각 페이지 (또는 패널)의 코드가 자체 파일에있는 청크로 분할 할 수도 있습니다. 이것은 실제로 어떤 것을하는지보기가 어려운 거대한 코드 파일 하나를 피합니다.적어도 각각의 '페이지'가 '요소'내에 있다는 사실 외에도 .ASPX 페이지에서는별로 할 수 없습니다. 패널이 많으면 커질 것입니다. 적어도 ViewState를 종료하면 커지는 것을 막을 수 있습니다.

Page_Load 메서드가 수행중인 모든 작업은 다중 페이지 프로세스의 첫 번째 페이지를 설정하는 것입니다. 다음 각 페이지에는 트리거하는 자체 이벤트 핸들러가 있습니다. OnInit (일반적으로 ViewState를 비활성화하는 위치)에서 이벤트 처리기를 준비합니다.

나는 또한 ASPX 페이지 자체에서 코드를 유지하고 실제로 코드 숨김을 사용하려고합니다. 이것은 여전히 ​​ASP.NET MVC에서 나에게 냄새를 맡기는 것들 중 하나입니다. 또한 코드를 모듈 식으로 유지하고 테스트 가능성 등을 허용하기 위해 할 수있는 일이 많이 있습니다. 그것은 당신의 질문을 조금 넘어서는 것입니다.