在我的_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(“索引”,“菜单”),但收到错误。
答案 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;
}