5

「コース」を扱うMVC4プロジェクトがあります。アプリ全体の多くのページでコースのリストを処理する必要があります。ユーザー プロファイルはリストをプルアップする必要があり、/Courses のインデックス ビューはリストをプルする必要があります。

このデータはほぼ常に必要とされるため、最初のリクエストの一部としてロードしたいので、DB へのクエリは 1 回だけで済みます。

データが Layout.cshtml に配置され、必要に応じて他のビューがモデル データにアクセスできるシナリオを想像しますが、これを実現する明確な方法はわかりません。問題を 2 つに分割できると思います。

  1. Layout.cshtml に読み込まれたデータを取得する
  2. 他のビューからこのデータにアクセスする

私は両方で少し立ち往生しています - どうすればこれを機能させることができますか?

4

3 に答える 3

7

Cacheまたはを使用OutputCacheし、このリストを に入れ、Partial View必要な場所にレンダリングする必要があります。

1) を作成してActionを作成しますPartial View。このビューは最大期間キャッシュされ、アクセスしてもオーバーヘッドは発生しません。

[NonAction]
[OutputCache(Duration = int.MaxValue, VaryByParam = "none")]
public ActionResult GetCourses()
{
  List<Course> courses = new List<Course>();

  /*Read DB here and populate the list*/

  return PartialView("_Courses", courses);
}

2)同じ方法でのChache入力を使用:Partial View

[NonAction]
public ActionResult GetCourses()
{
  List<Course> courses = new List<Course>();

  if (this.HttpContext.Cache["courses"] == null)
  {
    /*Read DB here and populate the list*/

    this.HttpContext.Cache["courses"] = courses;
  }
  else
  {
    courses = (List<Course>)this.HttpContext.Cache["courses"];
  }

  return PartialView("_Courses", courses);
}

Html.Action3)またはでこのビューをレンダリングしますHtml.RenderAction

@Html.Action("GetCourses", "ControllerName")

また

@{ Html.RenderAction("GetCourses", "ControllerName"); }

キャッシュの詳細:出力キャッシュによるパフォーマンスの向上

于 2013-09-18T18:50:33.103 に答える
1

私はあなたの欲求を理解しているかどうか確信が持てないので、2 つの答えがあります。

1) 静的ヘルパー メソッドを作成します。

public static class Helper
{
  public static List<Course> GetCourses()
   {
    return db.Courses.ToList();
    }

}

次に、ビューまたはレイアウトのどこでも呼び出すことができます。

@Helper.GetCourses()

Views2)またはでビジネス ロジックをレンダリングしたくないLayout。私は作成しますBaseControllerList<Course>このコントローラーに入ります。他のコントローラは から継承する必要がありBaseControllerます。したがって、どのコントローラーのメソッドでも、同じインスタンスを持つ可能性がありますList<Course>

于 2013-09-18T19:37:33.073 に答える
0

コースを にHttpContext.Current.Items保存します。これは、あなたのケースに理想的な 1 つのリクエストのアイテムをキャッシュします。または memcache などのサードパーティのキャッシュ コンポーネントを使用する

于 2013-09-18T19:41:08.663 に答える