Asp.net mvc 如何封装对ViewBag或ViewData的调用?

Asp.net mvc 如何封装对ViewBag或ViewData的调用?,asp.net-mvc,Asp.net Mvc,我希望能够在ViewData或ViewBag中注册脚本块,然后在布局页面的正确位置卸载它们 我尝试在我的\u布局中编写@function{},但无法从视图中调用它 那么,我如何编写一个类,允许我做类似的事情呢 @Something.registerscript("myscript.js") 然后在布局页面上 @Something.RenderScripts() 我在这里看到了一个使用单例模式的实现 但我担心这会引起问题,因为这应该是动态的,而不是静态的 这是针对通用解决方案,还是只想在视图

我希望能够在ViewData或ViewBag中注册脚本块,然后在布局页面的正确位置卸载它们

我尝试在我的
\u布局
中编写
@function{}
,但无法从视图中调用它

那么,我如何编写一个类,允许我做类似的事情呢

@Something.registerscript("myscript.js")
然后在布局页面上

@Something.RenderScripts()
我在这里看到了一个使用单例模式的实现


但我担心这会引起问题,因为这应该是动态的,而不是静态的

这是针对通用解决方案,还是只想在视图中包含脚本文件?对于后者,您始终可以创建一个名为“Head”的节或在
-元素中创建的任何内容

例如:

_layout.cshtml
<html>
     <head>
          @RenderSection("Head", false)
     </head>
     ...
</html>

View.cshtml
@section Head
{
    <script type="text/javascript">...</script>
}
\u layout.cshtml
@渲染部分(“头部”,假)
...
View.cshtml
@科长
{
...
}

我不会把这个作为一个答案,因为有可能你真的想做更多的事情(据我所知,这不适用于EditorTemplates等)。但如果你想把事情复杂化,这很容易

为什么要使用ViewBag进行此操作?如果您想创建具有请求范围的内容,请使用HttpContext.Current.Items——在您的示例中,实现一个存储帮助器方法和一个“呈现所有存储的内容”方法

Viewbag或它的近亲viewdata是用于此目的的最佳集合,因为您的上下文似乎在视图中。在哪里注册脚本&在哪里渲染脚本


我认为,您可以编写帮助器扩展来包装寄存器和渲染方面的内容。我相信助手方法可以访问viewdata。您将从实际使用的存储中获得额外的抽象,因为您只需要从这些助手方法中引用它。

为什么不使用viewbag?Im仅将数据从视图传递到_布局,然后再呈现页面?另外,你为什么不提供一个样本,而不是在我的解决方案中挑出漏洞呢?为什么不呢?因为我认为范围是错误的。例如,如果渲染生成多个零件,我不确定ViewBag的范围。。Items始终为solid 1请求范围。你们真的需要我提供“将此存储到字典中”、“从Dicrional获取此”包装的示例吗?我很惊讶这里有人会这样反应(“不要在我的解决方案中挑出漏洞”)-我试图帮助你,但我真的不知道如何将项目传递给一个方法,这就是我正在努力解决的问题,我可以通过引用来传递它吗?抱歉,刚刚有一天的时间…,我明白你对范围的看法了这是方便的信息…HttpContext.Current.Items-你可以在任何地方,在控制器中,在Html帮助程序(扩展方法)中,以这种方式使用它。好的,这太过分了。如果可能的话,我想尝试减少标记:-)以供将来的读者使用。