将数据从布局共享到RenderBody

时间:2018-07-03 08:19:21

标签: c# asp.net-mvc

我正在尝试将主_Layout中的数据共享到RenderBody渲染的视图中。

我试图使用在“ Shared / _Layout”中初始化的ViewBag,但是它不起作用。但是,我注意到该ViewBag可以局部使用,而不能用于@RenderBody显示的视图。

示例_Layout:

PageData["XX"] = "myValue";
ViewContext.Controller.ViewBag.XX= "myValue";
Page.XX= "myValue"; 
ViewBag.XX= "myValue";
ViewContext.ViewData["XX"] = "myValue";

<body>
    @Html.Partial("_MyPartial") // Everything has the correct value in the partial

    <main class="content">
        @RenderBody() // Everything is null in that view
    </main>
</body>

我尝试使用ViewBag.Property,ViewData [“ Property”],Page.Property和PageData [“ Property”],但在RenderBody渲染的视图中它们都为null。 似乎是因为Layout是最后编译的元素。

我不想使用任何代码。一切都必须存在于视图中,做一些类似于我上面的示例的操作。它必须在布局中,因为我要共享的值是由用户通过CMS定义的。这意味着该布局不仅用于静态页面,而且还用于控制器呈现的视图。

我的问题是:如何从_Layout提供数据/共享数据到RenderBody()渲染的视图?

4 个答案:

答案 0 :(得分:0)

在您的布局中尝试一下:

@ViewContext.Controller.ViewBag.Test= "test";

答案 1 :(得分:0)

  

我如何向RenderBody()渲染的视图提供/共享数据?

控制器负责准备数据(模型,ViewBag,TempData等)并将其移交给视图。

您还可以查看filters来准备数据。


您需要在您的Controller中填充ViewBag:

public class HomeController
{
    public ActionResult Index()
    {
        // populate your ViewBag
        ViewBag.myValue = "some text";
    }
}

然后在您的View / PartialView中可以像这样使用它:

MyPartialView.cshtml

<label>@ViewBag.myValue</label>

答案 2 :(得分:0)

是的,您可以在局部视图中使用viewBag。当在剃刀文件中调用viewBag(.cahtml) 您必须返回局部视图才能显示。

答案 3 :(得分:-1)

ViewBag和ViewData是特定于视图的,因此只要您单击其他View / Action,它们就会被清空。尝试检查此链接http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications以获得更多信息。

尝试使用TempData实现效果-http://www.tutorialsteacher.com/mvc/tempdata-in-asp.net-mvc