我们有一个相当复杂的应用程序,以前使用过WebForms。我们正在使用MVC从头开始重写它的一部分。我们的应用程序由许多小部件组成,它们共同构成了应用程序的功能。

在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最佳实践的答案。

有帮助吗?

解决方案

这个问题很久以前就被问过了,所以可能你已经处理好了。但对于未来的访问者,也许这个解决方案会有所帮助: http://marcinbudny.blogspot.com/2010/01/handling -stylesheet引用-in.html

其他提示

Free Telerik MVC工具有一个脚本和一个样式寄存器,可以做你想要的......

不确定这是否适合您,但请尝试将该调用移至每页底部。

我总是将我的javascript和css文件包含在html HEAD中,所以我不知道它是否会降低效果。我的假设是它可以在大多数浏览器中运行,但是你可能会在一些浏览器中出现随机问题。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top