2009-07-29 31 views
1

我们有一个以前使用WebForms的相当复杂的应用程序。我们正在使用MVC从头开始重写它的一些部分。我们的应用程序由许多小部件组成,它们共同组成应用程序的功能。ASP.NET MVC从多个控制器汇总CSS/JS

在WebForms中,我们使用了UserControls。每个UserControl将通过存储在HttpContext.Current.Items中的集合注册其CSS和JavaScript。这个集合将被合并为一个单一的请求。通常这会发生在Page_Load事件中,并且包含页面将呈现一个脚本标记,该标记将包含该页面所需的所有JavaScript和CSS。

我们一直在努力在MVC中做同样的事情。我们使用主页中的许多视图来模仿小部件。每个小部件都有自己的控制器,所以功能可以充分隔离。主页面使用MVC未来的RenderAction在页面上构建小部件。最初我们对CSS/JS文件使用相同的注册方法。每个控制器将在一个Action中注册它所需的文件。这些文件将包含在HttpContext.Current.Items集合中,并将呈现给页面。为了实现这一点,我编写了一个HtmlHelper扩展来将链接/脚本呈现给页面。它看起来像这样:

<%= Html.GetRegisteredCssFiles() %> 

问题是,MVC使用更自上而下的方法。此调用是在页面的标记中进行的,但我们后面的RenderAction调用发生在下面。在RenderAction被调用并且所需文件在HttpContext.Current.Items中注册时,上面的代码已经执行。所以,集合在适当的时候不会被修改。

有没有人有任何想法,我们应该如何构建?我正在寻找包含MVC最佳实践的答案。

回答

0

不确定这是否对您而言是可行的解决方案,但请尝试将该调用移至每个页面的底部。

我一直都在html头文件中包含我的javascript和css文件,所以我不知道它是否会起作用。我的假设是它可以在大多数浏览器中运行,但是你可能会在一些浏览器中出现随机问题。

另一种方法是让GetRegisteredFiles()输出一些JavaScript,将CSS文件加载到正确的位置(通过DOM操作)。

这些解决方案中的任何一个都存在的问题是,直到结束才会包含这些文件,这可能会导致页面看起来“普通”,直到下载CSS。

或者,控制器可以预测哪些“小部件”将被加载并将该数据传递给母版页。

1

自由Telerik的MVC工具都有一个脚本和样式寄存器,可能会做你想要的...

+0

雅我最近注意到了。我已经检查过它,但我认为这不会有助于在备用控制器中注册脚本。将挖掘并检查。 – 2009-09-04 14:22:51