Eri*_*ric 7 html javascript c# razor asp.net-mvc-3
我正在尝试将我的所有javascript包含移到页面底部.我正在使用带Razor的MVC.我写了一个帮助方法来注册脚本.它使脚本按照它们注册的顺序保留,并且不包括欺骗.
@{ Html.RegisterScript("/scripts/someFile.js"); }
Run Code Online (Sandbox Code Playgroud)
然后就在关闭身体标签之前,我做了类似这样的事情:
@Html.RenderScripts()
</body>
Run Code Online (Sandbox Code Playgroud)
如果脚本全部在一个页面上注册,这一切都可以正常工作.如果我在我的布局中注册了一些脚本,并在内部视图中注册了一些脚本,那么事情就会出错.基本上,内部视图在布局之前执行.因此,虽然内部视图中的脚本依赖于外部视图中的脚本,但它们之前已经过注册.
所以,如果我有_Master.cshstml,它有
@{
Html.RegisterScript("script1.js");
Html.RegisterScript("script2.js");
}
Run Code Online (Sandbox Code Playgroud)
然后我将InnerView.cshtml与_Master.cshtml作为其布局并在我拥有的视图中
@{
Html.RegisterScript("script3.js");
}
Run Code Online (Sandbox Code Playgroud)
脚本按以下顺序呈现:script3,script1,脚本2.
有什么办法可以强制布局在内部视图之前执行吗?我已经尝试过各种各样的东西,内部视图似乎总是先执行.也许这是预期的?如果是这样,那么我完成我想要做的最好的方法是什么?
我最终通过跟踪每个视图的脚本解决了这个问题。基本上我保留一个
Dictionary<string, SortedList<int, string>> registeredScripts;
Run Code Online (Sandbox Code Playgroud)
和一个
SortedList<int, string> viewOrder;
Run Code Online (Sandbox Code Playgroud)
每次注册脚本时,我都会传入脚本路径和视图名称(从 ViewDataContainer.ToString() 检索)。我跟踪在 viewOrder 对象中看到视图的顺序。然后,我使用字典来跟踪每个视图的脚本。关键是视图名称。当需要渲染所有内容时,我反转 viewOrder SortedList<> 并按视图写出所有脚本。好的一点是,脚本是按视图排序的,并且一旦颠倒视图顺序就是正确的。
我对此的解释很糟糕,但出于版权原因我无法共享代码。
| 归档时间: |
|
| 查看次数: |
4169 次 |
| 最近记录: |