我需要使用局部 View 在布局中呈现菜单(如果有更好的方法,请告诉我)。我这样做(在布局中):
@if (User.IsInRole("Admin"))
{
@Html.Partial("AdminMenu")
}
这就是我在 Controller 中的调用方式:
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 仅将 View 作为字符串返回,不会将其写入响应,因此仅调用它什么都不做,返回的字符串超出范围。它存在的原因是您可以将局部 View 呈现为字符串,然后将字符串插入多个位置,而无需多次呈现局部 View 。例如,如果您希望相同的分页标记位于页面的顶部和底部。或者,您可能想要复制一个 Tab Partial View 以创建多个选项卡,等等。
要让你当前的代码工作,试试这个
Model ......
@{
Layout=.....
var adminMenu = Html.Partial("Admin");
}
@if (User.IsInRole("Admin"))
{
Html.Raw(adminMenu);
}
Html.RenderPartial 做同样的事情,但在内部调用 Write 将其写入响应。
现在如果你的 Partial 正在接受一个模型,那么你需要给它一个 Controller 方法,
[ChildActionOnly]
public ActionResult AdminMenu(AdminMenuViewModel model)
{
return Partial(model);
}
然后将您的调用代码更新为,
@{Html.RenderAction("AdminMenu", "ControllerHere", new { model = TheAdminViewModelHere });}
我个人更喜欢将 ChildOnlyAction 用于我的部分 View ,因为我可以将所有处理逻辑移动到部分 View 的 Controller 中,这样性能更好。它还允许局部 View 了解有关其父上下文的信息,因为它允许您访问 Controller 以将信息添加到模型以传递给局部 View 。
关于c# - ASP.NET MVC 如何在布局中使用分部 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410586/