从_Layout调用视图及其控制器

时间:2016-04-13 20:57:37

标签: asp.net-mvc

在我的_Layout中,我尝试调用视图及其控制器。视图是Menu.cshtml。

问题是视图菜单无法识别其参数。

_Layout(在文件夹/共享/中):

<div id="menu" >

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

</div>

Menu.cshtml(在文件夹/ Views /中):

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

        // do some stuff

        }                
     }
</ul>

MenuController(在文件夹/ Controllers /中)

    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;

          }

        }

加载View Menu时,会出现错误,因为无法识别参数Model.ParentMenuModel。

从_Layout调用视图及其控制器的正确方法是什么?

当View位于Shared文件夹中时,我可以毫无错误地运行它,但是想要调用一个独立的View及其Controller。

编辑:

我尝试使用@ Html.Action(“索引”,“菜单”),但收到错误。

enter image description here

3 个答案:

答案 0 :(得分: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的对象传递给部分视图以供菜单使用。

答案 1 :(得分:1)

如果要调用并呈现现有Action的结果,则需要使用Html.Action() HTML Helper方法:

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

Html.Partial()助手只会尝试直接呈现视图而无需访问控制器,因此如果您没有通过Html.Partial("{view-location}", YourViewModel)传递模型,您的模型将始终为{视图中的{1}}。

一般来说,如果您已经拥有正在使用的模型的实例,或者您的View根本不需要模型,null可能没问题。否则,如果您需要点击控制器操作,Html.Partial()更合适。

答案 2 :(得分: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;

    }