【问题标题】:What is the best practice of passing data from a controller to a view layout?将数据从控制器传递到视图布局的最佳实践是什么?
【发布时间】:2016-02-05 22:13:06
【问题描述】:

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

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

我了解到我不应该在可能的情况下使用 Viewbag,而且我通过数据轮次的次数感觉不对。

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

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

【问题讨论】:

  • 也许是child actions。如果您经常重复使用相同的数据,您也可以输出缓存这些。
  • @Jasen - 谢谢,这看起来很有趣......我现在要尝试实现。请你把它写成答案,除非真的搞砸了/我无法实施或者有更好的答案,我认为这就是要走的路。

标签: c# asp.net-mvc model entity-framework-6 asp.net-mvc-viewmodel


【解决方案1】:

您可以使用子操作来做到这一点。您可以重复使用此操作,甚至可以将其包含在 _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() 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" })}
}

【讨论】:

  • 我最害怕的一件事是视图中有动态元素,并且需要在每个页面上获取新 ViewModel 中的元素......这样做,结合输出缓存(我以前不知道)非常完美,正是我想要的和我需要的。
  • 附注我将缓存设置为仅 5 分钟,并且由于更新每 2 个月发生不到一次,这确实不是问题……但是……有没有办法以编程方式使缓存过期,我可以添加到更新项目的部分代码?
  • Here's 关于 OutputCache 的一些好信息。 Here's a SO answer 关于使缓存失效。
  • 谢谢!正是我需要的
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2012-10-30
相关资源
最近更新 更多