もう少し複雑にしてみてください。
<div if="orders.Any()" each="var order in orders">
Here's your order #${orderIndex+1}:
<ul>
<li each="var p in order.Products">
${pIndex}: ${p.Name}
<span if="pIsLast"> (the end)</span>
</li>
</ul>
</div>
ここに流れが見えます。私は実際にここでHTMLを見ることができます。今見てみましょう:
<% if (orders.Any()) { %>
<% var orderIndex = 0; foreach (var order in orders") { %>
<div>
Here's your order #<%= (orderIndex+1) %>
<ul>
<% int pIndex = 0; foreach (var p in order.Products)
{ bool pIsLast = pIndex == products.Count; %>
<li>
<%= pIndex %>: <%= p.Name %>
<% if (pIsLast) { %>
<span> (the end)</span>
<% } %>
</li>
<% ++ pIndex; } %>
</ul>
</div>
<% orderIndex++; } %>
<% } %>
私はここで迷子になっています。そこにHTMLはありますか?
私にとって、これが主な理由です。もちろん、Sparkは、マクロ(Html.Helpersをsparkマークアップでコーディングする)、PDFエクスポートなど、他の人がリストした多くの機能を提供しますが、プログラマーとしてはクリーンなコードを好みます。
別の例として、(int i = 0; i <products.Count; i ++){Product product = products [i];をよく使用しますか?.... } この日?foreach(var product in products){}を選択しますか?私は...するだろう。入力が少ないという理由だけではありません。なぜなら:
- それは意図をよりよく表現します
- 読みやすく
- それは私の疲れた心から追加の詳細(.Count、.Length、または.Count();または特別な方法でトラバースする必要があるIEnumerableの場合)を隠します
- コンテキスト(および私の疲れた心)を乱雑にする変数の数を減らします
- したがって、私は問題に集中することができます、何も邪魔になりません
- 内部に変数を含める必要がないため、{}を回避するのに役立ちます-行数を減らします
- コレクションをIListから配列に変更しても、50のループは変更されません。
これは、foreachのような単純なことです。それぞれの理由は単純ですが、合計するとさらに大きなものになります。そして、これらの理由はSparkに完全に当てはまります。ねえ、私は恋をしているようだ;-)
更新:今、あなたは何を知っていますか?私の投稿の編集履歴を見てください。あちこちでいくつかのビットを逃したという理由だけで、私はいまいましいASPコードを数回編集しなければなりませんでした。私はそれが正しいか間違っているかわかりません。そこにスパンがあるか、その場でコンディションがあれば、それは完全に隠されています。
更新:うーん、さらに別の編集...ASPのif/spanをli内に移動...