2016-04-13 3 views
0

В моем _Layout я пытаюсь вызвать представление и его контроллер. Просмотр - Menu.cshtml.Вызов вида и его контроллера от _Layout

Проблема в том, что меню просмотра не распознает его параметры.

_layout (в папке/Shared /):

<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?

Я могу запустить его без ошибок, когда View находится в папке Shared, но хотел бы вызвать независимый View и его контроллер.

EDIT:

Я пытался использовать @ Html.Action ("Index", "Меню"), но получает сообщение об ошибке.

enter image description here

ответ

1

Html.Partial вспомогательный метод не будет вызывать ваш метод действия. Ваше частичное представление для меню строго типизировано до класса MenuModel, а внутри частичного представления вы получаете доступ к свойству ParentMenuModel вашей модели. Вы получаете исключение, потому что модель передана в представление NULL (, потому что вы не прошли ни одного), и вы пытаетесь получить доступ к объекту объекта NULL!

Так что либо вы должны явно передать его (объект MenuModel) при вызове метода Html.Partial или ваш основной вид (который звонит этот частичный) также должны быть набраны в одной и той же модели (MenuModel)

Что вы должны делать, вместо того, чтобы звонить Html.Partial, вы должны использовать метод Html.Action.

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

Это позволит выполнить метод Index действий в MenuController, который будет проходить объект MenuModel с частичным видом на меню.

+0

Я попробовал то, что вы предложили, но он получает сообщение об ошибке. Можно ли вызвать вид, который не находится в общей папке, из _Layout? – Delmonte

+0

Какая ошибка вы получаете? Да. вы можете вызвать представление из другой папки, кроме общей папки. Вам просто нужно указать полный путь. – Shyju

1

Если вы хотите вызвать и отображения результатов существующего действия, необходимо использовать Html.Action() HTML метод Helper:

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

Помощник Html.Partial() будет просто пытаться визуализировать View непосредственно никогда не осуществляющего доступ к контроллер, поэтому, если у вас нет модели, передаваемой в нее через 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; 

    } 
Смежные вопросы