2016-04-13 14 views
0

私の_Layoutでは、ビューとそのコントローラを呼び出そうとしています。表示はMenu.cshtmlです。_Layoutからビューとそのコントローラを呼び出す

[表示]メニューでパラメータが認識されないという問題があります。

_layout(フォルダ内の/共有/):

<div id="menu" > 

    @Html.Partial("~/Views/Menu/Menu.cshtml")      

</div> 

Menu.cshtml(フォルダ/ビュー/):

@model MenuModel 
<ul id="menu"> 
    @{ 
     foreach (var iteparent in Model.ParentMenuModel) // Error: Model.ParentMenuController is not recognized 
     { 

     // do some stuff 

     }     
    } 
</ul> 

MenuController(フォルダ内/コントローラ/ )

public class MenuController : Controller 
     { 

      public ActionResult Index() 
      {    
       MenuModel objmenumodel = new MenuModel(); 

       objmenumodel.ParentMenuModel = new List<BE_MENU>(); 
       objmenumodel.ParentMenuModel = ParentMenuList(); 

       return PartialView(objmenumodel); 
      } 

      public List<BE_MENU> ParentMenuList() 
      { 
      List<BE_MENU> objparentmenu = new List<BE_MENU>(); 
      objparentmenu.Add(new BE_MENU { ID_MENU = 1, TXT_MENU = "Home", PARENT_ID = 0, URL = "#" });     
      return objparentmenu; 

      } 

     } 

ビューメニューが読み込まれると、パラメータModel.ParentMenuModelが認識されないため、エラーが発生します。

ビューとそのコントローラを_Layoutから呼び出す正しい方法はありますか?

ビューは共有フォルダにあるが、独立したビューとそのコントローラを呼び出すときにエラーなしで実行できます。

EDIT:

私はHtml.Action( "インデックス"、 "メニュー")@を使用しようとしましたが、エラーが発生します。

enter image description here

答えて

1

Html.Partialヘルパーメソッドは、あなたのアクションメソッドを呼び出すことはありません。メニューの部分ビューは、MenuModelクラスに強く入力され、部分ビューの内部では、モデルのParentMenuModelプロパティにアクセスしています。ビューに渡されたモデルがNULL(を渡さなかったので)であり、NULLオブジェクトのプロパティにアクセスしようとしているため、例外が発生しています。 Html.Partial方法または(この部分を呼んでいる)あなたのメインビューを呼び出すとき

だから、どちらかが明示的にも同じモデルに入力する必要があり、それ(MenuModelのオブジェクト)を渡す必要があります(MenuModel

あなたがしなければならないことは、Html.Partialを呼び出す代わりに、Html.Actionメソッドを使用する必要があります。

<div id="menu" > 
    @Html.Action("Index","Menu") 
</div> 

これは、メニューのための部分的なビューにMenuModelの物体を通過するMenuControllerIndexアクションメソッドを実行します。

+0

を私はあなたが提案し何をしようとしたが、それはエラーを取得します。共有フォルダにないビューを_Layoutから呼び出すことはできますか? – Delmonte

+0

どのようなエラーが表示されますか?はい。共有フォルダ以外のフォルダからビューを呼び出すことができます。完全なパスを指定するだけです。 – Shyju

1

既存のアクションの結果を呼び出し、レンダリングしたい場合は、Html.Action() HTMLヘルパーメソッドを使用する必要があります。

<div id="menu" > 
    @Html.Action("Index","Menu") 
</div> 

Html.Partial()ヘルパーはちょうど今までにアクセスせずに、直接ビューをレンダリングしようとしますコントローラであるため、Html.Partial("{view-location}", YourViewModel)でモデルを渡す必要がない場合、モデルは常にビュー内でnullになります。

一般に、使用しているモデルのインスタンスを既に使用している場合、またはビューにモデルがまったく必要ない場合は、Html.Partial()はおそらく大丈夫です。それ以外の場合は、コントローラーアクションを実行する必要がある場合は、Html.Action()が適切です。

0

ちょうどこの試してみてください。

<div id="menu" > 

    @Html.Partial("MenuIndex") // I'm changing the name, because probably you must have other page or method with the same name      

</div> 

コントローラー:

public PartialViewResult MenuIndex() 
{ 
    MenuModel objmenumodel = new MenuModel(); 

    objmenumodel.ParentMenuModel = new List<BE_MENU>(); 
    objmenumodel.ParentMenuModel = ParentMenuList(); 

    return PartialView(objmenumodel); 
} 

    public List<BE_MENU> ParentMenuList() 
    { 
     List<BE_MENU> objparentmenu = new List<BE_MENU>(); 
     objparentmenu.Add(new BE_MENU { ID_MENU = 1, TXT_MENU = "Home", PARENT_ID = 0, URL = "#" }); 

     return objparentmenu; 

    } 
関連する問題