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

9 浏览
0 Comments

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

我目前有一个MVC网站,每个页面的头部需要有动态内容。

我目前在控制器中正常获取所需的数据并将其放入视图模型中。在视图中,我将数据放入Viewbag中的模板部分,并最后将Viewbag数据传递给控制头部的局部视图。

我已经读到尽量不要使用Viewbag,并且我传递数据的次数感觉不对。

我唯一能想到的改进方法是在主布局中创建一个部分,然后将局部视图/数据放入部分中的视图中-但是,有大约30个页面,这似乎也不是正确的方法。

有没有更好的方法来实现这个/在传递到主视图的动态数据方面有什么最佳实践?

0
0 Comments

传递数据从控制器到视图布局的最佳实践是使用子操作(Child Actions)。子操作可以被重用,并且可以包含在_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.Section @Model.Today.ToLongTimeString()

然后在视图或布局中使用Html.Action()或.RenderAction()来调用子操作。

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

你可以在布局中指定一个section,并在视图中根据需要进行条件渲染。

_Layout.cshtml文件内容如下:

@RenderSection("header", required: false)

主视图中的代码如下:

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

这种方式最大的好处是可以在视图中动态获取数据,而且使用输出缓存可以提高性能。如果需要在更新数据时手动使缓存失效,可以参考这个Stack Overflow的回答

这种方式非常适合我的需求,通过使用子操作和输出缓存,可以轻松地在视图布局中传递数据。

0