2017-08-15 10 views
2

私は教師自身のMVCをやっていて、難しい問題に遭遇しました。私のデータベースには、ビール用テーブルとビール用テーブルがあります。もちろん、Beerに醸造所があることを保証するための外部キー制約があります。この制約は、データベースにそのビール醸造所のビールがある場合、ビール醸造所が削除されるのを防ぐための「行動なし」制約です。この種のロジックの正しい場所はどこですか?

私は醸造所の索引ページを実装しています。自動的に生成されたコードは、醸造所と編集、詳細、および削除をリストしています。ここまでは順調ですね。 Beersを持つBreweryを削除しようとすると、その削除は外部キー制約のために失敗します。

しかし、削除できない場合は削除オプションを保留する方が良いようです。これは、このようなビューのコードにつながる: -

@Html.ActionLink("Edit", "Edit", new { id=item.BreweryID }) | 
@Html.ActionLink("Details", "Details", new { id=item.BreweryID }) 
@if(item.Beers.Count == 0) 
{ 
    <text> |</text> 
    @Html.ActionLink("Delete", "Delete", new { id=item.BreweryID }) 
} 

モデルのデザインビューに漏れ出ているように私には思えるが、私はすべての選択肢を見ることができません。削除リンクが表示されているかどうか、ビューはこれを行う必要があります。

どのようにこのようなことに取り組まなければなりませんか?

+0

注意標準的な慣行です。 – pnm

+0

確かに。これは、最初に強く型付けされたモデルを持っている全体のポイントです。モデルとのやりとりのビューには何も問題はありません。それは、それが*想定しているものです。あなたはあなたの見解で余分なロジックを見てみたいです。単純にコレクションの数を取得することは問題ありませんが、 'Where'節を' Selects'などのように追加するなど、モデルクラスに入れ替えなければならないことがある場合には、 –

答えて

4

「漏れ」にはほとんど問題はありません。ビューに特定のデータが必要で、そのデータがモデルで使用可能な場合は、実際にデータにアクセスする上で問題はありません。それは非常に一般的なことです。

さらに、ビュー内の.Beersコレクションにアクセスしたくない場合は、bool HasBeersというプロパティをViewModelに追加することができます。コントローラでそのプロパティを設定してViewで使用すると、Viewはアクセスするよりも多くの情報にアクセスすることができません。

コード例:MVCで、自分の意見をしっかりので、その関連ビューでモデルの定義を活用し、定義されたモデルに結合されていることを

public class BreweryViewModel 
{ 
    public bool HasBeers { get; set; } 
    // other properties 
} 

public class BreweryController 
{ 
    public ActionResult Index() 
    { 
     var breweryVM = ... 
     var beers = ... 

     breweryVM.HasBeers = beers.Any(); 

     return View(breweryVM); 
    } 
} 
関連する問題