2012-01-15 25 views
0

私は1つの剃刀レイアウトを持っています。このレイアウトはすべての私のビューに広がっています。
今日まで、このレイアウトのナビゲーションメニューは(別のコントローラ)でした。しかし、このメニューには動的なデータがあります。そして私はレイアウトページにそれをもう保つことができません。
各ナビゲーションビューでこのナビゲーションメニューをレンダリングするか、それとも一度しか作成せずにデータを渡すだけの他の方法がありますか?マスターページにない場合はナビゲーションメニューを置く場所 - asp mvc

これは、私はかみそりのレイアウトにナビゲーションメニューをレンダリングする方法である:

CommonMenuビューで
@Html.Action("CommonMenu", "Navigation", new { area = "CityPage" }) 

私はホームリンクがあります。

<li> @Html.ActionLink("Home", "Index", "Home", new { area = "CityPage", city = ViewBag.City, countryCode = ViewBag.CountryCode }, null) 

をそして私は、そのメニューで1ページを開きます。私が家をクリックすると、私は市内の家に帰ることを期待しています(イギリス、ロンドンのように)。

しかし、私はこのページからチューリッヒのような他の都市に行くことができます。
これでナビゲーションメニュー全体を再バインドする必要があります。
ひげそりのレイアウトでメニューをレンダリングするとどうすればいいですか?
更新
これは私が別の都市のページから行く方法です:

@Html.ActionLink("Go To London", "Index", "Home", new { area = "CityPage", city = "London", countryCode = "UK" }, null) 

私は、このリンクミュー「CommonMenu」アクションが呼び出された上でクリックすると:

[ChildActionOnly] 
     public PartialViewResult CommonMenu(string countryCode, string city) 
     {... 

しかし、いくつかのこのアクションが数回呼び出される理由:
最初に両方の値がnullです。
2番目の値はUK、Londonです。
3回目はnullです。
これは私のページを壊してしまいます。

+0

この動的なデータの問題点は何ですか?なぜあなたはそれをレイアウトに残すことができないのですか?これは、各ビューでレンダリングされるメニューに最適な場所です。 –

+0

私は更新された質問があります。 – 1110

+0

私は本当に問題が何かを理解していません。なぜあなたはHtml.Actionを使用できませんか? –

答えて

0

レイアウトにRenderActionを使用できます。それは、コントローラからのアクションを呼び出し、ダイナミックあなたが望むように使用してそれをレンダリングします。この場合

@{ Html.RenderAction("Index", "NavigationMenu"); } 

を、それがアクションコントローラの「インデックス」「NavigationMenu」

+0

' @ {RenderAction ( "Index"、 "Navigation") '?@ Html.Action(" Index "、" Navigation ")'? – danludwig

+1

RenderActionは直接レスポンスにレンダリングし、Actionは文字列を返します。 。 – ivowiblo

+1

+1私はそれを知らなかった。参考のためのリンクがありますか? – danludwig

1

の結果をレンダリングしますあなたは、レイアウトナビゲーションのための子アクションを使用して適切なトラックにいます。ただし、ビューバックを使用する代わりに、強くタイプしないでください。

のViewModel:

public class CommonMenuLinkModel 
{ 
    public string Text { get; set; } 
    public string Area { get; set; } 
    public string Controller { get; set; } 
    public string Action { get; set; } 
    public string City { get; set; } 
    public string CountryCode { get; set; } 
} 

ビュー:あなたのコントローラでは、むしろViewBagで物事を置くよりも

@model IEnumerable<CommonMenuLinkModel> 
<ul> 
@foreach(var link in Model) 
{ 
    <li>@Html.ActionLink(link.Text, link.Controller, link.Action, 
     new {area = link.Area, city = link.City, countryCode = link.CountryCode}, 
     null)</li> 
} 
</ul> 

、CommonMenuLinkModelsの強く型付けされたコレクションに入れて、それをパーシャルビューに渡します。

注:これはレイアウトから呼び出された子アクションとして保持します。

更新

私はone of your questions that I previously answeredで言った何かを改めて表明したいと思います。 T4MVCを使用して、あなたはこのようなあなたのアクションリンク生成することができます:あなたがより明確にHTMLを制御することができますので、このように、

<li>@Html.ActionLink(link.Text, 
    MVC.CityPage.Home.Index(link.CountryCode, link.City))</li> 

あるいはさらに良いの:

<a href="@Url.Action(MVC.CityPage.Home.Index(link.CountryCode, link.City))"> 
    @link.Text</a> 
+0

私はビューバックを使用しています一時的に私はこれを変更しますが、私の問題のメニューアクション数回と呼ばれています。それは私の質問最後の更新です。 – 1110

+0

あなたのコードを見て、そのアクションが何度も呼び出される理由はわかりません。ルート定義が原因である可能性があります。あなたはマジック文字列の代わりにリンクを生成するためにT4MVCの使用を検討しましたか? http://stackoverflow.com/a/8810526/304832 – danludwig

関連する問題