6

つまり、現在では、最新のテンプレート エンジンを使用して HTML マークアップをコードから可能な限り分離しようという動きがすべてあります (昔のプログラマーは通常、PHP で文字列を連結し続けていましたが、これはひどいことでした)。

次に、HTML テーブルを生成するための同僚のコードを見ると、次のようになります。

<% Html.Grid(Model).Columns(column => {
    column.For(x => Html.ActionLink("Edit", "Edit", new { id = x.Id })).Attributes(width => "30px").DoNotEncode();
    column.For(x => Html.ActionLink("Delete", "Delete", new { id = x.Id }, new { @class = "delete" })).Attributes(width => "95px").DoNotEncode();
    column.For(x => x.Id).Named("Code");
    column.For(x => x.Name).Named("Name").HeaderAttributes(align => "left");
    column.For(x => x.CPF).Named("CPF");
})
.Attributes(width => "100%", border => "0", cellpadding => "0", cellspacing => "0", @class => "data-table")
.Empty("No users found!")
.RowStart(row => string.Format("<tr class='row{0}'>", row.IsAlternate ? "-alternating" : ""))
.Render();
%>

彼はすごいと思っていますが、私はかなり醜いと思うので、もっと多くの人の意見を知りたいです。

4

4 に答える 4

5

設計者にとって、それはコードの可読性の一歩後退です。ここに2つの意見はありません。

開発者の観点から、それは依存します。好きな人もいれば嫌いな人もいます。個人的に私はそれが好きで、より標準的な技術と比較してそれを好みforeachます。なんで?

シンプルなものから始め<table>ますforeach。次に、一部のユーザーは、交互の行スタイルを処理する必要があると言います。まず、を追加しifsます。次に、別のユーザーが、指定された列で注文できるようにする必要があると言います。これをさらに別ので処理しますifs。3番目のユーザーがページングを処理するように要求します=>さらに別ifsforeachビューで。あなたはスパゲッティで終わります。

結論:適切なターゲットに適切な銃を使用してください。単純なテーブルの場合、従来のアプローチはうまく機能しますが、より高度な作業を開始したら、ヘルパーを使用します。

于 2010-06-22T20:51:44.270 に答える
2

MVC Contrib Grid は、非常に多くの機能を備えているという理由だけで恐ろしく見えます。そのスイス軍クラスの HTML 拡張機能は、すべての人のためにすべてのことを行います。他の人が指摘したように、手動で行うのはさらに難しく、不器用です。私はデスクトップで、適切な効果を得るためにグリッドとスプレッドシートのコントロールを構成するための同様に不器用なコードを書いたことを覚えています。

ただし、必要性がより控えめである場合は、独自のものを作成してください。Phil Haack は、コード ベースのリピータに関する素晴らしい記事を書いています。あなたを助けるかもしれないいくつかの軽いグリッドビューヘルパーもあります。これらはそれほど強力ではありませんが、アプリケーションの特定のジョブにより適している場合があります。

于 2010-06-22T21:29:14.380 に答える
1

一見醜いですが、かなり簡潔で、多くのロジックを処理していると思います。たとえば、これに近いことを行うための標準MVC出力(マークアップなし)

    <table>
    <% dim index as integer = 0
      if model.count > 0 then %>
       <tr>
        <th>Edit</th>
        <th>Delete</th>
        <th>Code</th>
        <th align="left">Name</th>
        <th>CFP</th>
       for each item in model
         if index mod 2 = 0 then%>
           <tr>
         <%else%>
           <tr class ="alternate">
         <%end if%>
           <td><%= html.actionLink("Edit", "Edit", New With {.id = item.id})%></td>
           <td><%= html.actionLink("Delete", "Delete", New With {.id = item.id})%></td>
           <td><%: item.id%></td>
           <td><%: item.Name%></td>
           <td><%: item.CPF%></td>
         <% index += 1
            Next%>
    <%Else%>
        <tr><td>No Rows Found</td></tr>
    <%end if%>

</table>

そして、私はそこにもいくつかのことを逃したと確信しています。従来の方法では、行数を追跡するか、それが交互の行であるかどうかを知る方法が必要です。レコードがなく、通常、<% %>これらのコードブロックを処理するためのタグがたくさんある場合があります。

于 2010-06-22T20:40:59.843 に答える
1

あまりきれいではないことに同意しますが、テーブルの外観の規則を定義し始めると、拡張メソッドにリファクタリングして、これを大幅にクリーンアップすることができます。次に、テーブル定義をドライアップします。これが例です(実際のextensionthodsを除いたもの)。

<% Html.Grid(Model).Columns(column => {
    InsertEdit(column).Width(30);
    InsertDelete(column).Width(95);
    column.For(x => x.Id).Named("Code");
    column.For(x => x.Name).Named("Name").LeftAlignHeader();
    column.For(x => x.CPF).Named("CPF");
})
.ApplyDefaultStyle()
.Class("data-table")
.Empty("No users found!")
.DefaultAlternatingStyle()
.Render();
%>
于 2010-06-22T20:51:33.767 に答える