将数据从控制器传递到视图布局的最佳做法是什么?

What is the best practice of passing data from a controller to a view layout?

我目前有一个 MVC 站点,需要在每个页面的 header 上包含动态内容。

我目前在控制器中正常获取所需数据并将其放置在视图模型中。在视图中,我获取数据并将模板部分粘贴到 Viewbag,最后,在主布局页面上,我获取 Viewbag 数据并将其传递给控制 header.[=10= 的部分]

我读到我不应该尽可能使用 Viewbag,而且我通过数据轮的次数感觉不对。

我能想到的唯一改进方法是在主布局上创建一个部分,然后将 partial/data 放在视图的部分中 - 但是,有 ~30 页和这个又觉得路线不对。

有没有更好的方法this/what获取必须转到主视图的动态数据的最佳做法是什么?

您可以使用 Child 操作来做到这一点。您可以重复使用此操作,甚至可以将其包含在 _Layout 页面中。

这是一个 child 操作,用于显示一些 header 信息。它被标记为 ChildActionOnly 因此它只能在另一个视图中调用。它还利用 OutputCache 将结果保存 5 分钟。

[ChildActionOnly]
[OutputCache(Duration = 5 * 60)]
public ActionResult Header(string section)
{
    var info = new HeaderInfo
    {
        Section = section,
        Today = DateTime.Now
    };
    return PartialView("_header", info);
}

_header.cshtml

@model HeaderInfo
<div>
    <span>@Model.Section</span>
    <span>@Model.Today.ToLongTimeString()</span>
</div>

然后在 Html.Action() or .RenderAction() 的视图或布局中使用它。

@Html.Action("Header", "Home", new { section = "Cake" })
// or
@{Html.RenderAction("Header", "Home", new { section = "Pie" });}

您可以在布局中指定一个部分,然后在视图中有条件地呈现。

_Layout.cshtml

@RenderSection("header", required: false)

主视图

@section header {
    @{Html.RenderAction("Header", "Home", new { section = "Cake" })}
}