2016-07-09 9 views
3

テーブルがあり、その上の各アイテムにステータスまたは状態があり、このステータスに応じてアイテムを購入するか、または待機リストに設定することができます。論理を表示することは悪い習慣です

私は@ifステートメントを私のRazorビューに持っています。ステートメントはステータスをチェックしてから、適切なアクションのためにレンダリングするボタンを条件付きで選択します。

私は、セッションとロールのために、他のビューに類似のロジックを持っています。

いいですか?それを行うための他の方法はありますか?

@if(@item.status == 1) { 
    <a class="btn btn-default" href="Items/Buy/@item.id">Buy</a> 
} else if (item.status == 2) { 
    <a class="btn btn-default" href="Items/SetList/@item.id">Add To List</a> 
} 
+0

ロジックが悪くなる可能性がありますが、部分的なビューについて確認することができます – brykneval

+0

ロジックはビューロジックなので、表示には問題ありません –

答えて

3

ビューで要素を表示するために使用されているため、世界で最悪のことではありません。しかし、私はあなたが作成しようとしているアクションリンクをレンダリングするためのHtmlHelperの拡張メソッドを作成します。何かのように:あなたのビューで次に

public static class HtmlHelperExtensions 
{ 
    public static HtmlString RenderStatus(this HtmlHelper helper, ItemModel item) 
    { 
     if (item.status == 1) 
     { 
      return helper.ActionLink("Buy", "Buy", "Items", new { @class = "btn btn-default" }); 
     } 

     if (item.status == 2) 
     { 
      return helper.ActionLink("Add To List", "SetList", "Items", new { id = item.Id }, new { @class = "btn btn-default" }); 
     } 

     return new MvcHtmlString(""); 
    } 
} 

、あなたがする必要があるだろう、すべてはあなたがこれをやったやり方に何か問題がありません

@Html.RenderStatus(item) 
+0

ああ、ありがとうございました。私は実際にはページ作成とソートなしに手作りのテーブルを使用しているので、WebGridで使用できると思います – MisaelGaray

2

呼んでいます。

あなたはそれが一般的にビジネスロジックを参照しているかを聞くあなたの意見内のロジックを含めること悪い習慣」であるという考え方についてお読みください。

ビュー内のコードから実行できるすべての種類のメソッドを持つビューにモデルを渡すことを妨げるものはありません(ただし、これを回避する必要があります。これはコントローラのアクションで行われます)。

あなたが示したロジックは、実際にレンダリングロジックです。出力に含める適切なHTMLを条件として選択しています。私の意見では全く問題ありません。

このロジックが1つ以上のビューで扱いにくい場合は、HTMLヘルパー、PartialViews、およびRazorの関数を使用して問題を解決できます。

0

あなたがやっていることが技術的にロジックをレンダリングしているという事実に根本的に同意しますが、何かを購入または追加できるかどうかを判断することはビジネスロジックと考えることができます。

また、表示またはアクティブにするロジックに依存するボタン以外のアイテムがある可能性があります。

私は、次のようなアプローチを示唆している:

  1. は、CanBuyとして、あなたのビューに1つのまたはそれ以上boolプロパティを定義します。
  2. プロパティの値は、次に、あなたのビューで、あなたがこのようなif声明単純化するので

    public bool CanBuy 
    { 
        get { return (status == 1); } 
    } 
    
  3. のように、コントローラやビュー内のプロパティ定義で設定することができます。

    @if(@item.CanBuy) { 
        <a class="btn btn-default" href="Items/Buy/@item.id">Buy</a> 
    } else if (item.CanAdd) { 
        <a class="btn btn-default" href="Items/SetList/@item.id">Add To List</a> 
    } 
    

さらに、HobbyHelperでこれを抽象化するための提案は、この方法と組み合わせることができます。

関連する問題