2008-09-07 11 views
8

ここにシナリオがあります。異なるタイプのコンテンツ(ページと記事)を表示する2つのコントローラを持つサイトがあるとしましょう。私は、いくつかの基準でフィルタリングされたページと記事をリストアップし、各ページに表示される私のマスターページにパーシャルビューを埋め込む必要があります。私は自分のマスターページにモデルを設定できません(私は正しいのですか?)。 Html.RenderPartialを使用してこのタスクを解決するにはどうすればよいですか?Html.RenderPartial call from masterpage

[編集] はい、おそらく記事やページのリスティングに別々の部分的なビューを作成していますが、それでも私はマスターページでモデルを設定できない、または設定しないでください。どういうわけか、私のレンダリング部分への引数として、そして記事のために「ここはページです」と言う必要があります。 masterpagesのデータベースからのデータを持つレンダリング部分全体のコンセプトは私には少しぼやけています。

答えて

0

ViewData Modelプロパティは、UIのメインセクションで表示/編集しているコンテンツに対してのみ使用する必要があります。

Viewの他の部分には、ViewDataにいくつかのデータが必要な場合がありますので、それらを辞書に追加してください。

私はちょうどこのような辞書のデータを渡すでしょう:ViewData ["articles"]を部分的に渡してください。 (またはMvcContribからのViewData.Get())。

MvcContribに実装されている最近実装されたSubControllerパターンもご覧ください。

0

はい、これは正しいです。このシナリオを見てみましょう:記事に関連するビューの を見ると、ViewData ["article"]があり、ページに関連するビューではViewData ["pages"]がありますが、記事とページは常に利用可能です。だから、私が追加した場合:

Html.RenderPartial( "articlesView"、のViewData [ "記事"])

Html.RenderPartial( "pagesView"、のViewData [ "ページ"])

を私にmasterpage、ViewDataDictionaryに記事とページの両方が含まれていない各ページに例外がスローされます。

少なくとも、それは私がそれを見る方法です。

1

私はsimilar postを持っていて、それを処理するためのオブジェクトモデルを思いついた。

強く型付けされていないビューは嫌いですが、このアプローチではうまくいきました。

2

HtmlHelper拡張メソッドを作成して、コントローラ上のアクションの部分ビュー結果を呼び出す方法について説明します。

あなたが

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %> 

とあなたのコントローラのように自分のマスターページに私の2セントで、適切な方法

public PartialViewResult RenderPartial() 
{ 

    return PartialView("~/Path/or/View",_homeService.GetModel()) 
} 

まあこれを使用することができ

public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender) 
    where TController : Controller, new() 
{ 
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext}; 
    actionToRender(arg).ExecuteResult(arg.ControllerContext); 
} 

ような何かとにかく

0

これを処理する方法は、BaseViewModelを使用することです。すべてのビューは、BaseViewModelから継承したビューモデルに対して強く型付けされます。

BaseViewModelクラスには、MasterPageに必要なすべての情報が含まれています。だから、ナビゲーションのためにあなたのBaseViewModelは次のようになります。あなたのマスターページとPartialViewsで

​​

を、あなたはBaseViewModelにモデルをキャストしNavigationsItemsプロパティにアクセスすることができます。

私はあなたのソリューションは、MVC 2.0 RCの地にあるのかもしれないし、超えた...

フィル・ハークが彼のブログに記事を投稿していることだと思い

<ul> 
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %> 
    <li> 
     <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a> 
    </li> 
<% } %> 
</ul> 
0

これは非常に返事が遅れていますしかし、私はこのページにグーグル・グーグルでいるので、他の人がこの質問(と私の返事)も見るでしょう。

この問題を回避する方法は、単純なjQueryスクリプトを使用してPartialViewをロードし、コントローラコードを実行することです。以下のサンプル。

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <script type="text/javascript"> 
      $(document).ready(function() { 
      $("#applicationForm").load("/Home/ApplicationForm"); 
      }); 
    </script> 

    <div id="applicationForm" /> 

</asp:Content> 

このアプローチの大きな欠点は、クライアントはそれを動作させるためのスクリプトが有効になっている必要があることである(それは本当にSEO無愛想なのです)。それがあなたと一緒に暮らすことができるものなら、それはうまくいきます。私はイントラネットのサイトでのみ使用しています。私は、各クライアントにJavaScriptが有効になっていることを知っています。私はGoogleのボットについて心配する必要はありません。