2016-04-12 18 views
2

私の_Layoutページで、私のサーバー上のJsonファイルから読み取る_Menusという部分ビューを使用してメニューを作成しようとしています。しかし、私はどのようにレイアウトページからモデルで部分的なビューを呼び出すかを理解することはできません。ここでAsp.net mvc4レイアウトでモデルの部分ビュー

は、共有フォルダ内にある_Menu.cshtmlページ、次のとおりです。ここで

@model IEnumerable<LangSite_151209.Models.MenuItem> 

<div id="menu" class="largescreen_show smallscreen_hide" data-display="flex"> 
    <div id="menu_left" class="menu_item"> 

     @foreach (var mainMenuItem in Model) 
     { 
      // A bunch of stuff with the model that draws the menu 
     } 
    </div> 
</div> 

は、私は_layoutページでそれを呼び出す方法です:

<!DOCTYPE html> 

<html lang="en"> 
<head> 
    <!-- Meta and script stuff --> 
</head> 
<body style="overflow:hidden;"> 


    <div id="fg"> 

     <div id="mobile_wrapper"> 
     @Html.Partial("../Shared/_Menu") 
     </div> 

    </div> 
    <!-- A bunch of footer stuff that's irrelevant here --> 
</html> 

私は部分を返す試してみました次のように、Jsonファイルを開き、それを部分的なモデルのモデルに変換するSharedControllerを使用して表示します。

しかし、これを試してみると、Model: "オブジェクト参照がオブジェクトのインスタンスに設定されていません"でNullReferenceExceptionが発生します。モデルをそのように部分的に渡すことはできません。 Jsonオブジェクトを読み取るコードは正常な(部分的ではない)ページで同じコードを使用するとモデルが正しく渡され、スクリプトによってメニューが描画されるため、動作することが分かりました。

通常、モデルを部分的に渡す場合は、モデルをメインページに置き、そのように渡します。しかし、私は_Layoutにモデルを入れる方法を知らない。それは私がそれにどのようにすべきか?それとも良い方法がありますか?

+0

@ Html.Partial( "viewName"、Model)のように、モデルを部分的に渡すことができます。問題は、モデルにすでに値が設定されていることです。 – Marko

答えて

3

@Html.Partial("../Shared/_Menu")は、あなたの_Menuアクションメソッドを実行しません。あなたの_Menu.cshtml部分表示は、MenuItemのリストに強く入力されます。したがって、Html.Partialメソッドを呼び出すときにexplicitly passを呼び出すか、(この部分を呼び出す)メインビューも同じコレクションに入力する必要があります。

Html.Partialの代わりにHtml.Actionメソッドを使用する必要があります。

@Html.Action("_Menu", "Shared") 

これは_Menuアクションメソッドを実行し、対応する部分表示に必要なデータ(MenuItemのリスト)を通過します。

+0

これは、コントローラコードを動作させる、ありがとう。今、私はエラーが発生している: "行の" System.StackOverflowException 'mscorlib.dllで発生した未処理の例外 " string filePath = HostingEnvironment.MapPath(@"〜/ App_Data/MenuItems.json "); – jimboweb

+1

しかしそれは別の質問かもしれません。 – jimboweb

関連する問題