Asp.net mvc RenderBody中的ViewBag是否被传递?

Asp.net mvc RenderBody中的ViewBag是否被传递?,asp.net-mvc,razor,Asp.net Mvc,Razor,非常简单的问题 我的布局页面看起来像 @RenderBody() @{ if (ViewBag.IsInternal) { //do something here } } @{ ViewBag.IsInternal = false; } 这个部分看起来像 @RenderBody() @{ if (ViewBag.IsInternal) { //do something here } } @{ ViewBag.IsInternal = fals

非常简单的问题

我的布局页面看起来像

@RenderBody()
@{
  if (ViewBag.IsInternal)
  {
    //do something here
  }
}
@{
  ViewBag.IsInternal = false;
}
这个部分看起来像

@RenderBody()
@{
  if (ViewBag.IsInternal)
  {
    //do something here
  }
}
@{
  ViewBag.IsInternal = false;
}

它在做我认为它应该做的事情吗?基本上,如果在局部视图中设置了ViewBag.IsInternal,我可以在布局中读取该设置值。

否局部视图将获得自己的ViewBag,因此修改它不会影响布局类中的ViewBag

但是,您可以将其作为参考传递到局部视图中,并从局部视图修改布局视图包,例如

布局

@{Html.RenderPartial("PartialView", Model, new ViewDataDictionary { {"LayoutViewBag", ViewBag}});
部分

@{
   var layoutViewBag = ((dynamic)ViewData["LayoutViewBag"]);
   layoutViewBag.IsInternal = true;
 }

您可以使用
Html.ViewContext.Controller.ViewBag
访问“共享”视图包。下面是一个示例,如果我使用了Pinterest按钮,我只想在页面底部包含“Pinterest”Javascript

 if (Html.ViewContext.Controller.ViewBag.Pinterest == true)
 {
      <text>
         <script type="text/javascript" async defer src="//assets.pinterest.com/js/pinit.js"></script>
      </text>
 }

如果只需要传递临时值,可以使用
TempData
。我认为它会一直保存到下一个请求。另外,根据
ViewBag
的说法,它只是
ViewData
的动态包装器,所以理论上,无论你在哪里拥有
ViewData
,你都应该拥有
ViewBag
谢谢!这是有道理的。我曾认为,由于它们显示在一个页面中,因此可能会涉及一些变量共享,但我猜情况并非如此。作为后续问题,使用
RenderPartial
,我必须具体命名partialview,但由于我使用了一组使用布局的partialview,我不想在布局中指定名称。我该怎么做呢?实际上,我可能只是使用
RenderSection
路线,并根据部分显示部分。这太过分了-只需使用
Html.ViewContext.Controller.ViewBag
这对我不起作用,在使用共享布局的视图中的局部视图中设置viewbag值并在该布局中读取时。使用断点时,我注意到该值是在读取之前设置的,但是该值丢失了。