2009-03-11 6 views
5

ASP.NET MVCフレームワークの最新リリースで、MasterPageViewのナビゲーションバーにカテゴリのリストを表示しようとするのとちょっと混乱します。 私はこれまでPartialsで0回の経験があります(これが混乱を招きます)。ASP.NET MVC - MasterPageViewとRenderPartials - Confusion

RenderPartialのこの変形を使用する必要がありますか?

HtmlHelper.RenderPartial(string partialViewName, object model) 

私はこの方法のいずれかの良い例を見つけることができませんでした。規約上、MasterPageViewの権利に関連するモデルはありません。では、MasterPageViewからデータを「部分的」にプッシュまたはプルする適切な方法は何ですか?

<div id="navigation"> 
     <% 
      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 
      Html.RenderPartial("NavBar", lst); 
     %> 
    </div> 

答えて

0

私が代わりにHtml.RenderAction()を使用して、それから部分ビューを返します。このメソッドは絶対に間違った道を下って行くと仮定すると

。あなたの部分のコール

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%@ Import Namespace="app.Models" %> 

+0

どこからRenderAction()メソッドを得るのですか?これは貢献物ですか? – BuddyJoe

+0

これは、CodePlexのMVC Futuresにある可能性があります。私は手を覚えていません(今すぐ確認できる場所に近いところにありません) –

1
public ActionResult NavBar() 
{ 

      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 


      return View(lst); 
} 

、ここ

<div id="navigation"> 
     <% 
      Html.RenderPartial("NavBar"); 
     %> 
    </div> 

をすべてレンダリングUIを行いますのActionResultを行うことができ、あなたのコントローラに

+0

私のコントローラのすべて1つで、このNavBar()コールをしなければなりませんか?またはそれを継承する...それは正しいように見えません。 – BuddyJoe

+0

私が行うのは、Controllerを継承し、再利用可能なすべての部分コード呼び出しをベースコントローラーに入れ、すべてのコントローラーにBaseControllerを継承させるBaseControllerを作成することです。そうすれば、すべてのコントローラはその部分にアクセスできます。 – Ayo

+0

いいえ、あなたはいけません。あなたのナビゲーションコード@ masterpageファイルを入れてください – Funky81

1

を呼び出すことがありますので、私はそれを言うでしょうマスターページでは、おそらくViewDataに渡すデータを鍵を握る。通常のビューページの場合は、厳密に型指定されたページを持つ方がよいでしょうが、これは別のケースです。あなたのようなプロセスは、通常のビューページの場合と、コントロールに続いて

<% 
    if (ViewData["MasterPageData"] != null) 
    { 
     Html.RenderPartial("ControlName.ascx", ViewData); 
    } 
%> 

:このような何かを

ViewData["MasterPageData"] = FunctionToGetData(); 

そして、マスターページ上:だから、あなたはおそらく、あなたのコントローラで何かこれを行うだろう。

<% var categories = (CastIfNeeded)ViewData["MasterPageData"]; %> 

process as normal... 

私はまだマスターページにデータを渡す必要はありませんでしたが、それはあなたがやると思う方法です。詳細情報here.

EDIT:私の現在のプロジェクトで何をしているのかを反映するため少し変更しました。

+0

+1良い情報。あなたの例であなたにこれを聞かせてください...あなたの[オブジェクト]モデルとしてデータを渡します。あなたはそれを部分的な側からどのように参照していますか?このチュートリアルでは、ViewDataメソッドを示します。 – BuddyJoe

+0

あなたの質問に(うまくいけば)答えるように編集されました。 –

7

あなたのマスターページにビューデータを持たせたくありませんか?あなたは...他のすべてのViewDataをクラスから継承し、ベースビューデータクラスを持つことによって

BaseViewData.csそれを解決できる - これは他のすべてのViewDataクラスが

public class BaseViewData 
{ 
    public string Title { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    IList<Category> NavCategoryList { get; set; } 
} 

から継承するViewDataをクラスであります今すぐあなたのSite.Masterページで簡単に

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseViewData>" %> 

<title><%=ViewData.Model.Title %></title> 
<meta name="keywords" content="<%=ViewData.Model.MetaKeywords %>" /> 
<meta name="description" content="<%=ViewData.Model.MetaDescription %>" /> 

<%= Html.RenderPartial("NavBar", ViewData.Model.NavCategoryList) %> 
大幅にアプリケーションのアーキテクチャに影響を与える可能性が

これが、その必ずしも悪いことがあります。

HTHS、 チャールズ

+0

私はこの方法に従います。 –

+0

+1 Hmmm。これはうまくいくかもしれません...そして、少なくとも私は "ViewData.Model"を知っています。構文。なぜ私はまだそれを見ていなかったか分かりません。 – BuddyJoe

+0

Kiggプロジェクトはこのように、私はそれを実装しようとしています。マスターページでこれを実行できるように、モデルをロードする場所と方法:ViewData.Model.Titl – Picflight