문제

다른 진술과 그에 따른 HTML 마크 업이 일부 'MVC'법칙을 위반하는 경우 복합체를 이동함으로써 궁금한 점이 궁금했습니다.

매우 읽을 수없는 다른 진술이면 인라인에 직면했을 때 훌륭한 옵션처럼 보입니다.

도움이 되었습니까?

해결책

나는 내 견해에서 클래스 뒤에있는 코드를 사용하지 않는 것을 선호합니다. 이것은 기본적으로 MVC를 위반하기 때문이 아니라 "자연적인"방법 (적어도 나에게는)이 다르다는 것을 알았 기 때문입니다.

순수한 관점 문제와 관련된 복잡한 HTML 마크 업에 직면하면 일반적으로 확장 방법을 작성합니다. HtmlHelper 복잡성을 숨기기 위해 클래스. 따라서 나는 같은 확장을 가지고 있습니다 Html.MoneyTextBox(), Html.OptionGroup() 그리고 Html.Pager<T>.

복잡한 조건이 발생하는 경우 다른 경우에는 일반적으로 컨트롤러에서 무언가를 놓쳤습니다. 예를 들어, 가시성과 관련된 모든 문제, 읽기 또는 활성화 요소는 일반적으로 컨트롤러가 제공 할 수있는 것에서 나옵니다. 이 경우 모델을보기에 전달하는 대신 HTML 마크 업을 단순화하기 위해 컨트롤러가 제공 할 수있는 모델과 추가 정보를 캡슐화하는보기 모델을 만듭니다. 보기 모델의 일반적인 예는 다음과 같습니다.

public class CustomerInfo
{
  public Customer Customer { get; set; }
  public bool IsEditable { get; set; }  // e.g. based on current user/role
  public bool NeedFullAddress { get; set; }  // e.g. based on requested action 
  public bool IsEligibleForSomething { get; set; }  // e.g. based on business rule
} 

즉, 뒤에있는 코드는보기의 일부이므로 필요에 맞는 경우 자유롭게 사용할 수 있습니다.

다른 팁

당신의 견해에 조건부를 갖는 것은 끔찍하지 않습니다. 나는 그것들을 코드가 아닌 ASPX에 보관할 것입니다. 그러나 조건부는 종종 행동을 통제하는 것을 나타냅니다. 다음 ASPX 코드를 고려하십시오.

<%if (ViewData["something"] == "foo") {%>
     <%=Html.ActionLink("Save", "Save") %> 
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
     <%=Html.ActionLink("Delete", "Delete") %> 
<%}%>

이 조건부 세트는 뷰에 의해 처리되는 동작 (즉, 잘못된 위치)을 나타냅니다. 이 동작은 단위 테스트 가능하지 않습니다. 대신 고려하십시오.

<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
     <%=Html.ActionLink(command) %>
<%}%>

이 예에서 ActionLink는 자체 ICOMMAND 사양 객체를 가져 오는 HTMLHELPER의 사용자 정의 확장입니다. 이보기를 렌더링하는 컨트롤러 동작은 다양한 조건에 따라 ViewData [ "명령"]를 채 웁니다. 다시 말해, 컨트롤러는 제어를 수행합니다. 이 조치에 대한 단위 테스트에서는 올바른 명령 세트가 다양한 조건 하에서 제시 될 것을 테스트 할 수 있습니다.

처음에는 이것은 몇 가지 if를보기에 빠르게 던지는 것과 비교하여 번거 로움처럼 보일 수 있습니다. 당신이 스스로에게 물어봐야 할 질문은 "이것이 통제 행동을 나타내는 경우, 그리고 어느 시점에서 휴식을 취하지 않도록 보장하고 싶습니까?"입니다.

나는 그것이 렌더링 코드라고 생각하고 컨트롤러에 있지 않은 "보기"에 있다고 생각합니다. 그러면 코드 뒤에 있거나 인라인에 넣는 것은 중요하지 않습니다. 컨트롤러 동작 에이 렌더링 코드를 작성하지 않도록하십시오 (이 방법으로 MVC 패턴을 실제로 위반할 것입니다).

CodeBehind는보기의 일부입니다. ASPX에 직접 또는 CodeBehind에 물건을 넣고 싶다면 그것은 당신에게 달려 있습니다. MVC는 ASPX에서 모든 것을 못 생겼다는 것을 의미하지는 않습니다. :).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top