我需要使用部分视图在布局中渲染菜单(如果有更好的方法,请告诉我)。我这样做(在布局中):
@if (User.IsInRole("Admin"))
{
@Html.Partial("AdminMenu")
}
我在控制器中这样称呼它:
public ActionResult AdminMenu()
{
var am = _amr.GetAdminMenu();
return PartialView(am);
}
所以这是我的部分观点:
@model IEnumerable<DigitalHubOnlineStore.ViewModels.AdminMenuViewModel>
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
Admin menu
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
@foreach (var item in Model)
{
<li><a href="@Html.DisplayFor(modelItem => item.MenuItemUrl)">@Html.DisplayFor(modelItem => item.MenuItemName)</a></li>
}
</ul>
</div>
不幸的是它不起作用。
你需要使用
@{Html.RenderPartial("Admin");}
Html.Partial 仅以字符串形式返回视图,不会将其写入响应,因此仅调用它不会执行任何操作,返回的字符串超出范围。它存在的原因是您可以将部分视图渲染为字符串,然后将字符串插入到多个位置,而不必多次渲染部分视图。例如,如果您希望页面顶部和底部具有相同的分页标记。或者也许您想复制选项卡部分视图以创建多个选项卡等。
要让您当前的代码正常工作,请尝试以下操作
Model ......
@{
Layout=.....
var adminMenu = Html.Partial("Admin");
}
@if (User.IsInRole("Admin"))
{
Html.Raw(adminMenu);
}
Html.RenderPartial 执行相同的操作,但在内部调用 Write 将其写入响应。
现在,如果您的部分正在接受模型,那么您需要给它一个控制器方法,
[ChildActionOnly]
public ActionResult AdminMenu(AdminMenuViewModel model)
{
return Partial(model);
}
然后将您的调用代码更新为,
@{Html.RenderAction("AdminMenu", "ControllerHere", new { model = TheAdminViewModelHere });}
就我个人而言,我更喜欢对部分视图使用 ChildOnlyAction,因为我可以将所有处理逻辑移至部分视图的控制器中,这样性能更好。它还允许分部视图了解有关其父上下文的信息,因为它允许您访问控制器以将信息添加到模型以传递给分部视图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)