2011-01-16 7 views
1

私はMVCを初めて使っています。トランザクションの一覧を表示する画面を構築しています。したがって、私のコントローラでは、リスト<> TransactionLinesを構築します。私はそれを私のビューに渡します。私のビューは、次のようなコードを持っています:ASP.Net MVC - テーブルの作成

 <table width="1000" border="0" cellspacing="1" cellpadding="2"> 
     <tr class="headerRow"> 
      <td> 
       Transaction Date 
      </td> 
      <td> 
       Payee 
      </td> 
      <td align="right"> 
       Amount 
      </td> 
      <td> 
       Category 
      </td> 
      <td> 
       Cost Center 
      </td> 
      <td> 
       Budget Assignment 
      </td> 
      <td> 
      </td> 
     </tr> 
     <% 
      decimal runningTotal = 0; 
      int rowNum = 0; 


      foreach (var trans in Model) 
      { 
       rowNum++; 
       runningTotal += trans.TotalAmount; 

       if (trans.IsSplit == false) 
       { 
        foreach (var line in trans.Transactions) 
        {%> 
     <tr <% if(rowNum % 2 == 0) { %> class="alternateRow" <%}%>> 
      <td> 
       <%=trans.TransactionDate.ToShortDateString()%> 
      </td> 
<%--   <td> 
       <%=trans.IsCredit ? "CR" : "DR"%> 
      </td> 
--%>   <td> 
       <%=trans.Payee %> 
      </td> 
      <td align="right" <% if(trans.IsCredit==false) { %>class="debitCell" <% }%>> 
       <% =String.Format("{0:C2}", line.Amount)%> 
      </td> 
      <td> 
       <%=String.Format("{0} - {1}", line.Category, line.SubCategory)%> 
      </td> 
      <td> 
       <%=line.CostCenter%> 
      </td> 
      <td> 
       <%=line.Budget%> 
      </td> 
      <td> 
       <font color="gray"> 
        <%=String.Format("{0:C2}", runningTotal)%></font> 
      </td> 
     </tr> 
     <% 
} 
       } 
       else 
       { %> 
     <tr <% if(rowNum % 2 == 0) { %> class="alternateRow" <%}%>> 
      <td> 
       <%=trans.TransactionDate.ToShortDateString()%> 
      </td> 
<%--   <td> 
       <%=trans.IsCredit ? "CR" : "DR"%> 
      </td> 
--%>   <td> 
       <%=trans.Payee %> 
      </td> 
      <td align="right"> 
       <%=String.Format("{0:C2}", trans.TotalAmount)%> 
      </td> 
      <td> 
       <%=trans.Transactions[0].Category + " ...[More]" %> 
      </td> 
      <td> 
       <%=trans.Transactions[0].CostCenter + "...[More]" %> 
      </td> 
      <td> 
      </td> 
      <td> 
       <font color="gray"> 
        <%=String.Format("{0:C2}", runningTotal)%></font> 
      </td> 
     </tr> 
     <%} 
      }%> 
     <tr> 
      <td colspan="3" align="right"> 
       <strong> 
        <%=runningTotal.ToString("C2") %></strong> 
      </td> 
     </tr> 
    </table> 

これは、乱雑に見えるかもしれませんし、デバッグする悪夢です。また、私はそれを続行するのは難しいでしょう新しい要件があります。

これを行うより良い方法はありますか?

+1

私はあなたのプロジェクトにそれほど遠すぎない場合は、Razorビューエンジンを使用することをお勧めします。構文ははるかにクリーンです。 コントローラでテキスト出力を準備し、HTMLヘルパーを使用してシンプルなView Modelを渡して、ビュー内のより単純なロジックをカプセル化することも検討してください。 – JcMaltaDev

答えて

3

ビューモデルを作成します。 TransactionLinesのリストをビューに渡さず、代わりにTransactionDisplayLineクラスを作成し、そのリストをビューに渡します。

コントローラでは、TransactionLinesをループし、各アイテムに対してTransactionDisplayLineを作成します。

  • 合計
  • trans.IsCreditの実行:

    TransactionDisplayLineはこのようなものが含まれている必要がありますか? "CR": "DR" < - 文字列としてこの結果

  • String.Formatの( "{0:C2}"、line.Amount)< - 既にフォーマットされた文字列
た量

それから、ビュー自体は、行を出すが、データに関するそれ以上の決定/ロジックを作成しない実際の単純なforeach-loopになります。

コントローラにTransactionDisplayLinesが作成されるため、デバッグが容易になります。

偶数/奇数列サイクラーがあることに気付きました。これは、さらに複雑になります。 the one from Phil HaackのようなHTMLヘルパーに入れてみてください。

この醜いものは:

<tr <% if(rowNum % 2 == 0) { %> class="alternateRow" <%}%>> 

はその後

<tr class="<%: Html.Cycle("alternateRow","") %>"> 

になり、あなたたrowNumも同様に行っています。

+0

Thanks Michael。私はそのようにインパクトするつもりです。ありがとう。 – Craig

関連する問題