2009-10-06 4 views
2

좋아,Asp.Net MVC/Entity Framework. 태그 수프를 피하십시오?

엔티티 프레임 워크를 사용하는 새로운 MVC 프로젝트가 있습니다. 나는 메시지를 뱉어 내고있다. (이것은 게시판 스타일 섹션이다.) 이제는 테이블 출력의 행에 다른 클래스 스타일이 있어야하는 몇 가지 조건적인 요인에 따라 다르다.

컨트롤러에서 페이지로 전달되는 모델은 엔티티 모델입니다 (호출 메시지 및 데이터베이스와 같은 필드 포함) 이제

행 스타일을 얻는을에서 나는 다음,

했다
<% 
       int i = 0; 
       foreach (var message in ViewData.Model.MessageList) 
       { 
        string className = "rowEven"; 

        if (i % 2 == 0) { className = "rowOdd"; } 
        if (message.Deleted) { className = "deleted"; } 
        if (message.AuthorisedBy == null) { className = "notAuth"; } 
        if (message.Deleted) { className = "deleted"; } 

      %> 
        <tr class="<%=className%>"> 
         <td><%= Html.CheckBox("mc1")%></td> 
         <td> 
          <%= Html.ActionLink(message.Title, "Details", new { id = message.MessageID })%> 
         </td> 
         <td>User Name Here</td> 
         <td><%= Html.Encode(message.PublishDateTime.ToString())%></td> 
        </tr>     
      <% 
        i++; 
       } 
      %> 

어느 쪽이 꽤 못 생깁니 까, 어떤 제안이 더 좋은 방법이 있어야합니까?

+0

그냥 당신이 뷰 모델과 Html 헬퍼를 모두 사용할 수있는 추가 할. 일부 자료 (데이터 변환)는 ViewModel에 속하며 일부 항목 (특정 CSS 클래스 선택)은 HTML 도우미에 속합니다. 하나의 MessageItemViewModel을 사용하고 하나의 행만 렌더링하는 부분을 가짐으로써 Ajax 작업을 시작할 때 도움이 될 수 있습니다. –

+0

우리는 꽤 빨리 할 수있는 Ajax가 많기 때문에 당신이 말한 것을 좋아합니다. 추천 또는 몇 가지 예에 대한 링크를 제공 할 수 있습니까? 우리는 MVC를 처음 접했습니다. – LiamB

+0

약간의 노력이 필요하지만 뷰 엔진을 전환하면 페이지 내용이 더 선명하게 보일 수 있습니다. Spark View Engine을 살펴보십시오. http://sparkviewengine.com/ – alexandrul

답변

5

이것은 가장 확실하게 프레젠테이션 논리이며보기는 속해 있습니다. 그러나, 당신은 더 나은 모두 MessageMessageList 받아보기 도우미, 해당 CSS 클래스 선택 코드를 이동할 것 :

public static string GetMessageCssClassName(this /* Don't remember :) */, Message message, MessageList messages) 
{ 
    var cssClassName = messages.IndexOf(message) % 2 == 0 ? 
     "rowOdd" : "rowEven"; 

    if(message.Deleted) cssClassName = "deleted"; 
    if(message.AuthorisedBy == null) cssClassName = "notAuth"; 
    if(message.Deleted) cssClassName = "deleted"; 
} 

을 그리고 지금 당신은 i 카운터를 제거하기, 당신의 <tr class="Html.GetMessageCssClassName(...)">에 그를 호출 할 수

<% foreach (var message in ViewData.Model.MessageList) { %> 
    <tr class="<%= Html.GetMessageCssClassName(message, ViewData.Model.MessageList) %>"> 
     <td><%= Html.CheckBox("mc1")%></td> 
     <td> 
      <! -- Remaining stuff here --> 
<% } %> 
+0

GetMessageCssClassName (이 HtmlHelper 도우미, :)을 확장합니다. 확장 메서드를 추가 할 위치와 네임 스페이스를 incude하는 방법에 대한 메모를 추가 할 수도 있습니다. –

+1

또한 논리가 포함 된 프리젠 테이션 레이어의 부분에 단위 테스트를 추가 할 수있는 옵션을 제공하며 그렇지 않으면 자동 테스트를 작성하지 않아서 좋은 보너스가 될 수 있습니다. –

1

도우미 메서드를 추가하는 것은 어떻습니까? 당신은 기본 Html 헬퍼 클래스에 자신의 확장 방법을 쓸 수 있습니다, 그래서 당신은 같은 것을 쓸 수있다 : 여기 모델 - 뷰 - 뷰 모델을 사용하여 권하고 것

... 
<tr class="<%= Html.GetMessageCssClass(i, message) %>"> 
... 
2

합니다. 이를 통해 뷰 모델 클래스에 많은 로직을 캡슐화 할 수 있습니다. 그런 다음 로직을 인라인으로 배치하는 대신 뷰 모델에서 메소드를 호출하면됩니다. 이것은 당신이 더 많은 클래스와 끝까지하는 동안 당신이 더 많은 읽을 수있는 마크 업을 얻을

 <% foreach (var messageViewModel in ViewData.Model.MessageList) { %> 
       <tr class="<%=message.RowClass%>"> 
        <td><%= Html.CheckBox("mc1")%></td> 
        <td> 
         <%= Html.ActionLink(message.Title, "Details", new { id = message.MessageID })%> 
        </td> 
        <td>User Name Here</td> 
        <td><%= Html.Encode(message.PublishedAt)%></td> 
       </tr>     
     <% } %> 

... 그것은 다음과 같이 보일 만들 것입니다 및 응용 프로그램이 훨씬 더 쓸만한입니다. 보기를 아주 간단한 창으로보기 모델로 변환합니다. 그런 다음 뷰 모델은 뷰에서만 필요한 모든 논리 및 특성을 캡슐화합니다.

here은 MVC의 모델 -보기 -보기 모델 패턴을 처리하는 기사입니다. 속성 및/또는 메소드 묶음으로 클래스를 만들고이 클래스에 필요한 모든 것을 채워주면됩니다. 그런 다음 모델을 직접 전달하지 않고 클래스를보기로 전달하십시오. AutoMapper 또는 다른 매핑 프레임 워크를 사용하여 모델을 뷰 모델에 자동으로 매핑 할 수도 있습니다.

+0

안녕하세요 잭, 나는이 아이디어가 마음에 들지만, 우리가 이것을 어떻게 달성 할 수 있는지에 대한 예를 제공 할 수 있습니까? – LiamB

+0

질문에 대한 답변을 게시했습니다. –

0

많이 언급했듯이 Message 클래스의 확장 메서드를 작성하여 Namespace.Site 프로젝트 (mvc 프로젝트) 내에 배치 할 수 있습니다. 같은

뭔가 :

public static class Extensions 
{ 
    public static string CssClass(this Message message,int counter) 
    { 
     if (i % 2 == 0) 
      return "rowOdd"; 
     else if (message.AuthorisedBy == null) 
      return "notAuth";  
     else if (message.Deleted) 
      return "deleted"; 

     return "rowEven"; 
    } 
} 

사용법 :

<tr class="<%=message.CssClass(i)%>"> 
    <td><%= Html.CheckBox("mc1")%></td> 
    <td><%= Html.ActionLink(message.Title, "Details", new { id = message.MessageID })%></td> 
    <td>User Name Here</td> 
    <td><%= Html.Encode(message.PublishDateTime.ToString())%></td> 
</tr>