0

asp.net mvc 4 Web サイトにブレッドクラムを表示したいと考えています。ブレッドクラムの生成は、コンテキストに依存します。たとえば、フォーラム ページでは、ブログ ページとは異なる方法で決定されます。一方では、1 つの部分ビュー「ブレッドクラム」が存在する必要がありますが、この部分ビュー自体はコンテキストを認識していません。そして、ビューモデルをパンくずリストで「汚染」したくありません。私は2つの可能な解決策を考えました:

1) ブレッドクラムデータを含むベースモデルからビューモデルを派生させます。ビューでは、特定のビューモデルをモデルとして使用して部分ビュー「ブレッドクラム」を呼び出すことができます。2) アクションで、ブレッドクラムデータをどこかに保存します (たとえば、Web フォームでは HttpContext.Items がありました)。

しかし、私はこれらのオプションの両方にあまり満足していません. これを達成するためのよりエレガントな方法はありますか?

4

2 に答える 2

0

セッション状態が有効になっている場合は、セッションを使用できる可能性があります。

ビューでは、セッションデータを取得できます

@{
    var breadcrumbs = (BreadCrumbsCastHere)@Session["breadcrumbs"];
}
于 2013-02-07T17:38:38.810 に答える
0

パンくずリストの部分ビューには、コンテキスト (モデルとして、おそらくテキストと URL を含むパンくずリスト) を指定する必要があります。

各ビューがブレッドクラムを認識していると仮定すると、ブレッドクラム データをビューから部分ビューに渡すことができます。

ブレッドクラムをレイアウト ページにレンダリングする場合、ビューはブレッドクラム データをレイアウト ページに渡す必要があります。そのために を使用ViewBagします。

したがって、これを行う方法は次のとおりです(ブレッドクラムがそれほど深くなく、比較的安定している場合):

SomeView.cshtml

ViewBag.Breadcrumbs = new List<Breadcrmb>() {
          new Breadcrumb(){ Title = "Home", Url = Url.Action("Index", "Home") },
          new Breadcrumb(){ Title = TopicModel.Forum.Title,
                            Url = Url.Action("Forum",
                                             new { id = TopicModel.ForumId }) },
          new Breadcrumb(){ Title = TopicModel.Title,
                            Url = Url.Action("ViewTopic",
                                             new { id = TopicModel.Id }) }
};

_Layout.cshtml

@Html.RenderPartial( "_Breadcrumbs", ViewBag.Breadcrumbs )

_Breadcrumbs.cshtml

@Model IEnumerable<Breadcrumb>

@* Render breadcrumbs *@

パンくずリストのデータはもっと柔軟な方法で生成できますが、あなたはそれについて尋ねていないので、その部分については詳しく説明しません。ビューのブレッドクラムの親リストを取得してから、独自のブレッドクラムを追加する方が良いと言えます。

于 2013-02-07T17:55:59.220 に答える