我正在寻找有关如何创建可重用“控件”以便在多个MVC 3视图上使用的最佳实践.我可以创建一个Html帮助扩展方法(以编程方式或在razor中使用声明性帮助器)或者我可以创建一个局部视图.
在我的例子中,诀窍是我需要做的不仅仅是在视图调用helper / partial的地方转储一些HTML.除了在该位置放置一些HTML标记之外,我还需要添加一些javascript代码以使其工作.通常,我会将此代码放在页面的其他位置(例如底部).这当然是严格要求的.另外,请注意,javascript不是特定于控件实例的.换句话说,可以编写javascript,在页面上查找控件HTMl标记的所有实例,并使用适当的事件等“激活”它.
我想到了几种可能性.
>让帮助/部分转储HTML和< script>在它被调用的地方标记.这似乎是个坏主意,因为这意味着每页只能使用一次控件.
>有两个帮手.一个用于输出HTML标记,另一个用于输出javascript.第二个只会被调用一次,并将从页面底部调用,以便脚本最终到达正确的位置.如果我发明了第二个这样的控件,我会有4个帮助器(2个用于HTML,2个用于Javascript).
>创建某种控件可以注册javascript的ScriptManager. scriptmanager会有一些帮助,它会被添加到页面底部,并会为已经注册了一些脚本片段的所有控件转储javascript.对scriptmanager助手的调用可能在_layout.cshtml中,因此它会自动发生在需要它的任何页面上.当页面不需要它时,它什么都不做.我想这似乎不是MVC-ish.
>只需要一个帮助程序,它会吐出HTML,然后将javascript添加到每个页面上包含的site.js中.如果javascript在页面上找不到任何相关的标记,那么javascript就足够聪明,不会做任何事情(标记会有一个包含特定类的包装元素).但是,在所有页面上搜索标记会有开销,包括没有任何这些控件的页面.
>与#4相同,但将javascript放在自己的.js文件中,并仅将其包含在使用该控件的页面上.这对于不使用该控件的页面更有效,但它是一个额外的.js文件和相关的HTTP请求.
我倾向于#4,但这是一个解决的问题吗?还有更好的第六种选择吗?
解决方法:
我的公司正在使用MVCContrib可移植区域将代码打包成DLL,用于可重用的“组件”
可以通过扩展方法调用这些组件中的每一个.例如:
Html.Components().ShowPoll();
在每个组件中,有一种方法可以注册多个嵌入资源的css / js文件.我们的主站点将提取资源文件并在服务之前将minify组合起来.
该组件还将注册将在JQuery的Document.OnReady事件期间调用的任何页面事件.这允许每个组件都是迷你站点,具有自己的路由,模型和视图的独立功能.
在整个网站上,所有组件都提供相同的拉链JS.一个是因为文件将被缓存,两个 – 消除了确定页面上的组件及其所需资源的复杂性.
如果您想了解有关此设置的更多信息,请与我们联系.