Mvc Layout页面动态内容

时间:2014-04-10 09:46:50

标签: asp.net-mvc asp.net-mvc-4 layout dynamic master-pages

我有一个MVC布局页面(母版页),页眉和页脚中包含一些动态内容。

       <header>

        @Html.Action("GetHeader", "Layout")

    </header>

   <div id="body">

           @RenderBody()

    </div>

    <footer>
        @Html.Action("GetFooter", "Layout")
    </footer>

GetHeader和GetFooter操作方法从数据库获取值到对象中,并根据该对象的页眉/页脚属性返回局部视图。

但问题是我不想对数据库进行两次调用,因为它们都使用相同的对象类型。

那么有什么方法可以让我只调用一次数据库并保留该对象并在布局页面中使用它,而无需多次调用数据库?

除了使用viewbag之外的任何解决方案都会非常有用。

谢谢!

4 个答案:

答案 0 :(得分:1)

使用静态私有支持字段将值缓存在静态属性中。在getter中检查支持字段是否为null。如果为null,则查询数据库并进行设置。让属性返回支持字段。

这应该在您的数据访问层中。这称为单例模式。

答案 1 :(得分:1)

我认为一个好方法是使用部分定义将部分渲染为视图输出的一部分,然后使用&#34; @ RenderSection&#34;将它们添加到布局中。方法

<header>
   @RenderSection("AdditionalHeader", required: false)
</header>
<div id="body">
   @RenderBody()
</div>
<footer>
   @RenderSection(("AdditionalFooter", "Layout")
</footer>

然后在您的视图中创建要渲染的部分:

@Section AdditionalHeader
{
   <whatever content you want to generate from action>
}
@Section AdditionalFooter
{
   <whatever content you want to generate from action>
}

这应该适用于MVC 3和转发。如果您需要更多细节,Scott Guthrie会做更详细的报道:

http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

答案 2 :(得分:0)

修改后的答案:

您可以使用MVC中提供的ViewBag,ViewData等来存储数据库中的数据,并在整个MVC应用程序中使用它,而无需再次调用它们。

Link解释了它们,您可以根据您的要求使用它。

您所要做的就是在主操作方法中存储数据库中的数据(默认情况下为索引),

ViewData["Data"]=data;

数据可以是保存数据库值的任何类型的对象。

在您的视图页面中,您可以将其传递给其他操作方法,例如

@Html.Action("ActionMethod", (ObjectTypeOfData)ViewData["Data"])

在您的操作方法中,您可以将其作为参数,例如

public ActionResult ActionMethod(ObjectTypeOfData data){ .... your code ....}

注意:如果您不希望在回发后使用Session而不是ViewData

从数据库中检索数据

答案 3 :(得分:0)

使用这种方式为header和footer.cshtml为共享文件夹中的页脚创建header.cshtml

然后使用@ {Html.RenderPartial(&#34; header&#34;);}和@ {Html.RenderPartial(&#34; footer&#34;);}将该.cshtml页面调用到布局页面中p>

在header.cshtml和footer.cshtml页面中,您使用sql查询或linq查询放置动态值