1

私はc#でmvc3アプリケーションを持っています。ここでは、私は常にいくつかのオブジェクトリストを送信してすべてのビューを実行します。すべてのコントローラーで私は宣言します

DBEntities db = new DBEntities();

私が書くすべてのビューで:

    public ActionResult Index()
    {
        ViewBag.Categories = db.Categories.ToList();
        ViewBag.Brands= db.Brands.ToList();
        ViewBag.Products= db.Products.ToList();
        ...
        return View();
    }

他の見方でも私は書いています

public ActionResult OtherView()
        {
            ViewBag.Categories = db.Categories .ToList();
            ViewBag.Brands= db.Brands.ToList();
            ViewBag.Products= db.Products.ToList();
            ...
            return View();
        }

他のコントローラーとそのビューでは、dbから同じコレクションを呼び出します。このコードを1回記述して、レイアウトビューに送信する方法はありますか?

4

2 に答える 2

1

コントローラーでそれを行うメソッドを作成できます。

private void PopulateViewBags()
{
    ViewBag.Categories = db.Categories.ToList();
    ViewBag.Brands= db.Brands.ToList();
    ViewBag.Products= db.Products.ToList();
}

次に、それをActionResults呼び出すだけです:

public ActionResult Index()
{
    PopulateViewBags();
    ...
    return View();
}

これは簡単な方法であり、キャッシュできるPopulateViewBags()ため、データベースへのトリップが減少します。これにより、DB にアクセスしなくても、Actionsこれらを必要としない他の機能を正常に動作させることができます。ViewBags

于 2012-08-18T15:55:27.913 に答える
1

基本コントローラーを定義し、そのコンストラクターでそれらのリストを作成できます。

public class MyBaseController : Controller
{
    public MyBaseController
    {
        DBEntities db = new DBEntities();
        ViewBag.Categories = db.Categories.ToList();
        ViewBag.Brands= db.Brands.ToList();
        ViewBag.Products= db.Products.ToList();
    }
}

次に、すべてのコントローラーがこのクラスから派生していることを確認してください。ただし、これは、アプリケーションへのすべてのリクエストで、それらのテーブルのすべてのデータをフェッチすることを意味します。これにより、パフォーマンスが低下する可能性があります。それらを非同期でフェッチして表示することを考えることができます。

于 2012-08-18T13:59:05.100 に答える