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

C# 将数据从控制器传递到视图布局的最佳实践是什么?,c#,asp.net-mvc,model,entity-framework-6,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Model,Entity Framework 6,Asp.net Mvc Viewmodel,我目前有一个MVC网站,需要在每个页面的标题上都有动态内容 目前,我在控制器中正常获取所需数据,并将其放置在视图模型中。在视图中,我获取数据并将模板部分粘贴到Viewbag中,最后在主布局页面上,获取Viewbag数据并将其传递给控制标题的分部 我已经读到我不应该在可能的情况下使用Viewbag,而且我传递数据的次数感觉不太对 我能想到的改善这一点的唯一方法是在主布局上创建一个部分,然后将部分/数据放在视图的部分中-但是,有大约30个页面,这同样感觉不到正确的路线 是否有更好的方法来执行此操作/

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

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

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

我能想到的改善这一点的唯一方法是在主布局上创建一个部分,然后将部分/数据放在视图的部分中-但是,有大约30个页面,这同样感觉不到正确的路线


是否有更好的方法来执行此操作/获取必须转到主视图的动态数据的最佳做法是什么?

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

下面是一个显示一些标题信息的子操作。它被标记为
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);
}
\u header.cshtml

@model HeaderInfo
<div>
    <span>@Model.Section</span>
    <span>@Model.Today.ToLongTimeString()</span>
</div>
@RenderSection("header", required: false)
您可以在布局中指定一个剖面,然后有条件地渲染视图中的剖面(如果存在)

\u Layout.cshtml

@model HeaderInfo
<div>
    <span>@Model.Section</span>
    <span>@Model.Today.ToLongTimeString()</span>
</div>
@RenderSection("header", required: false)
主视图

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

也许。如果你经常重复使用相同的数据,你也可以输出缓存这些数据。@Jasen-谢谢,这看起来很有趣。。。我现在将尝试实施。请你把它写下来作为一个答案,除非有什么事情真的搞砸了/我无法实现或者有更好的答案,我想这就是解决方法。我最害怕的一件事是在视图中有动态元素,并且要求在每个页面上都在一个新的ViewModel中获取元素。。。这种方式,再加上输出缓存(我以前不知道)就是完美的,正是我想要和需要的。我将缓存设置为仅5分钟,并且由于更新将不到每2个月发生一次,所以这真的不是问题。。。但是是否有一种方法可以通过编程使缓存过期,我可以将其添加到更新项目的代码部分?关于OutputCache的一些好信息。关于使缓存无效。谢谢!正是我需要的