8

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

[編集]はい、記事とページを一覧表示するために個別の部分ビューを作成する可能性がありますが、それでも、マスターページにモデルを設定できない、または設定すべきではないという障壁があります。私のrenderpartialの議論として、また記事についても、どういうわけか「ここにページがあります」と言う必要があります。マスターページのデータベースからのデータを使用したrenderpartialの全体的な概念は、私には少しぼやけています。

4

7 に答える 7

2

コントローラーのアクションで部分ビューの結果を呼び出すことができる HtmlHelper 拡張メソッドを作成するのはどうですか。

何かのようなもの

 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);
} 

これをマスターページで次のように使用できます

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

そしてあなたのコントローラーで適切なメソッド

public PartialViewResult RenderPartial()
{

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

とにかくそれは私の2セントです

于 2009-05-28T07:32:50.810 に答える
0

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

ビューの他の部分では、ViewDataに存在するデータが必要になる場合があるため、それらをディクショナリに追加するだけです。

次のように辞書からデータを渡すだけです:ViewData["articles"]パーシャルに。(またはMvcContribのViewData.Get())。

また、MvcContribに実装された最近実装されたSubControllerパターンを確認することもできます

于 2008-09-07T21:47:12.340 に答える
0

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

Html.RenderPartial( "articlesView"、ViewData ["articles"])

Html.RenderPartial( "pagesView"、ViewData ["pages"])

マスターページでは、ViewDataDictionaryに記事とページの両方が含まれていない各ページで例外がスローされます。

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

于 2008-09-07T21:54:56.050 に答える
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のボットについて心配する必要はありません。

于 2010-01-08T10:23:09.607 に答える
0

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

BaseViewModel クラスには、MasterPage が必要とするすべての情報が含まれています。したがって、ナビゲーションの場合、BaseViewModel は次のようになります。

public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}

MasterPage と PartialViews で、Model を BaseViewModel にキャストし、NavigationsItems プロパティにアクセスできます。

<ul>
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
    <li>
        <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a>
    </li>
<% } %>
</ul>
于 2009-11-13T07:09:49.883 に答える