2012-07-18 1 views
2

현재 MVC로 기존의 webforms 애플리케이션을 변환하려고하고 있으며 페이지 중 하나를 설계하는 방법을 모르겠습니다. 기존 페이지는 2500 줄의 코드이며 같은 정보에 대한 여러 가지보기를 표시합니다. 다음 예제는이 페이지 (툴바)의 작은 조각이지만 코드 복제를 피하는 것이 가장 좋은 방법인지는 잘 모르겠습니다.유사하지만 완전히 동일하지 않은 요소에 대한 MVC 부분 뷰

관리자보기 도구 모음 : 저장, PDF는, 인쇄, 관리 문서 맞춤법 검사, 도구 모음의 직원보기 전환

관리자보기 : 저장, PDF, 인쇄, 직원보기 전환, 맞춤법 검사

도구 모음의 직원보기 : 저장, PDF, 인쇄, 맞춤법 검사

나는 세 가지 다른보기로 응용 프로그램을 분할했습니다. 그들은 페이지의 내용을 렌더링하기 위해 동일한 부분 뷰를 사용하지만, 현재 각 뷰에는 툴바의 자체 복사본이 있습니다. 따라서 저장, PDF, 인쇄 및 맞춤법 검사를위한 HTML 요소는 각각의보기에 복제됩니다. 부분 뷰를 사용하여 툴바를 렌더링하는 것이 가장 이상적이지만이를 수행하려면 Employee View Toggle 링크 또는 Administrative Documents를 표시할지 결정하기 위해 뷰에 일종의 로직을 넣어야합니다.

다른 새로운 페이지를 개발하는 동안 비슷한 문제가 발생했습니다. 처음에는 여러 페이지에 대한 요구 사항이 부분 뷰로 분리 된 동일한 요소를 갖습니다. 테스트하고 더 많은 기능을 추가 한 후에 결국 부분보기가 각 페이지마다 약간 달라야합니다. 일반적으로 그것은 특정 컨트롤의 가시성 일 뿐이지 만 결국 부분 뷰는 결국 뭔가를 표시해야하는지 결정하기 위해 여러 가지 사항을 확인하기 위해 여러 로직을 갖게됩니다.

대부분의 요소가 동일한 약간 다른보기를 처리하는 가장 좋은 방법은 무엇입니까?

답변

3

동일한 컨트롤/부분보기/다른 부분을 표시하거나 숨기는 권한 문제인 경우 권한을 확인하기 위해 코드를 작성하고 조건부로 렌더링하거나 렌더링하지 말아야합니다. 부분품. 이런 식으로 뭔가 :

<%@ Control Language="C#" %> 

This is the toolbar!! 

<div class="fake-css-class"> 
<%:Html.ActionLink("Save", "Save") %> 
<%:Html.ActionLink("PDF", "Pdf") %> 
<%:Html.ActionLink("Spell Check", "SpellCheck") %> 
<% if (CurrentUser.IsInRole("Admin") { %> 
<%: Html.ActionLink("Administrative Documents", "AdminDocs") %> 
<%} %> 
<% if (CurrentUser.IsInRole("Admin") || CurrentUser.IsInRole("Manager"){ 
     %> 
<%: Html.ActionLink("Employee View Toggle", "EmpView") %> 
<%} %> 
</div> 

<br /> 
<br /> 

편집 : 논리가 더 복잡해지면 밖으로 모델/컨트롤러에와보기 당신 '에서 모든 논리를 분리 할 수 ​​있도록

은 보안 코드에 기능을 추가 단일 함수 호출을 다시 작성합니다. 예를 들면 다음과 같습니다.

public bool Authorize(string controllerName, string actionName) { 

      bool authorize = false; 

      foreach(var permission in this.permissions) { 
       if (permission.Matches(controllerName, actionName)) { 
        authorize = permission.Affirmative; 
       } 
      } 

      return authorize; 
     } 

이 방법을 사용하면보기 외부에 코드가 있고보기에 코드가 하나만있을 수 있습니다. 위의 코드는 현재 프로젝트에서 가져 와서 예제로 사용했지만 복잡하거나 복잡한 논리를 작성하여 모델이나 컨트롤러에 넣을 수 있으므로 뷰가 깨끗하게 유지되고 거기에 비즈니스 로직을 넣지 않아도됩니다.

+0

Giovanni. 이것은 우리가 취한 접근법입니다. 저는 당신이 당신의 견해에 논리를 가져서는 안된다는 인상하에있었습니다. 내가 읽은 것으로부터 단순한 역할 점검을하는 것은 받아 들일 만하지만, 거의 항상 더 복잡한 것으로 성장하는 것처럼 보인다. 예를 들어 편집 권한이있는 사용자 만 저장 단추를 사용할 수 있도록 요구 사항이 변경된 경우 특정 유형의 콘텐츠를 볼 때 저장하려는 콘텐츠가 있고 "콘텐츠가 승인되기 전에" 논리가 매우 복잡하게 편집 될 수 있습니다. – Carl

+0

@ nunes7452 나는 코멘트에서 응답하려했지만 이상한 대답이 내 대답을 업데이 트했습니다. –