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

本文关键字:布局 最佳 是什么 视图 数据 控制器 | 更新日期: 2023-09-27 18:20:34

我目前有一个MVC网站,需要在每个页面的标题上都有动态内容。

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

我读到过,我不应该在可能的情况下使用Viewbag,而且我传递数据的次数太多了,感觉不太对劲。

我能想到的唯一改进方法是在主布局上创建一个部分,然后将部分/数据放在视图的部分中——然而,大约有30页,这再次感觉不是正确的路线。

有没有更好的方法/获取必须进入主视图的动态数据的最佳实践是什么?

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

您可以使用"子动作"来执行此操作。您可以重用此操作,甚至可以将其包含在布局页面中(_Layout)。

这是一个显示一些标头信息的子操作。它被标记为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()或.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" })}
}