MVC:如何让控制器呈现由视图发起的部分视图

29

在我的MVC5项目中,我想要在一个部分视图中创建一个菜单。这个菜单是动态的,因为它是从我的数据库中的内容构建的。因此,我有一个控制器负责创建我的菜单并将菜单模型返回到我的部分视图:

public PartialViewResult GetMenu()
{
   MenuStructuredModel menuStructuredModel = menuBusiness.GetStructuredMenu();

   return PartialView("~/Views/Shared/MenuPartial", menuStructuredModel);
}

在我所谓的MenuPartial局部视图中,我想使用Razor来迭代我的菜单项,例如:

@model MyApp.Models.Menu.MenuStructuredModel

<div class="list-group panel">
    @foreach (var category in Model.ViewTypes[0].Categories)
    {
        <a href="#" class="list-group-item lg-green" data-parent="#MainMenu">@category.ShownName</a>
    }
</div>

现在问题是我插入局部视图的方式。如果在视图中只是这样做:

@Html.Partial("MenuPartial")

它不会首先调用控制器来填充模型数据。我希望的是让控制器返回部分内容。但我不知道如何从视图中实现这一点。在伪代码中,我想做类似以下的事情:

它不会首先调用控制器来填充模型数据。我希望的是让控制器返回部分内容。但我不知道如何从视图中实现这一点。在伪代码中,我想做类似以下的事情:

@Html.RenderPartialFromController("/MyController/GetMenu")

4
请在您的GetMenu()方法上使用[ChildActionOnly]装饰器,然后在视图中使用@Html.Action("GetMenu", "MyController") - user3559349
非常感谢,它有效 :-) - brinch
@StephenMuecke 您的评论必须成为一个被接受的答案! - Click Ok
2个回答

43

多亏了 Stephen Muecke 和 Erick Cortorreal 的帮助,我终于使它工作了。

这就是控制器应该的样子:

[ChildActionOnly]
public PartialViewResult GetMenu()
{
   MenuStructuredModel menuStructuredModel = menuBusiness.GetStructuredMenu();

   return PartialView("~/Views/Shared/MenuPartial", menuStructuredModel);
}

它可以这样调用:

@Html.Action("GetMenu", "Home")

(因此在我的示例中,GetMenu()HomeController 中被声明)。

在呈现局部视图之前,控制器现在被调用(并填充模型)。


4
你甚至没有被采纳,是吗?:( - Scott Fraley
4
指定局部视图时,对我来说,扩展名(.cshtml)是必需的。 - sky

10
您应该使用:@Html.RenderAction@Html.Action

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接