使用Javascsript操作的ASP.NET MVC 3中的HTML帮助程序

man*_*nny 2 c# model-view-controller html-helper razor-declarative-helpers asp.net-mvc-3

我在Helpers.cshtml文件中有很多HTML帮助器,但是一些帮助器(html)需要一些jquery动作,所以我如何在helpers.cshtml中调用jquery,这可能吗?

我知道我们能继续保持页眉或特定页面的js文件,但我不希望做这样的,我只希望这加载特定助手页面上使用jquery或javascript.

有谁有这个想法?我的方案是,我有列表框控件,从helper正确加载,但我需要将自定义主题应用于列表框.

更多的清晰度

//in index.cshtml
@Helpers.testListBox("mylist" "1,2,3,4,5,6,7")


//in Helpers.cshtml
@helper testListBox(string listName, string listData){

    //...... HTML code .........

    //Javascript here?

}
Run Code Online (Sandbox Code Playgroud)

Car*_*ond 5

使用Web窗体,当在页面上使用某些服务器控件时,框架可以自动包含Javascript(一次); ASP.Net MVC没有这样的设施.听起来这就是你所缺少的.

这样做的方法是在客户端.请访问http://requirejs.org/查看RequireJS .这是一个用于管理Javascript依赖项的客户端库.这就是Web Forms所做的,但更好,而且做得更多.您的主布局将具有如下脚本标记:

<script src="/Scripts/require.js" type="text/javascript" data-main="/Scripts/main"></script>
Run Code Online (Sandbox Code Playgroud)

这可以是您在每个页面上包含的唯一脚本标记.其他所有内容都可以根据RequireJS的需要动态加载.确实,你在每个页面加载它,但它比jQuery小,它赢得了它的位置,因为它为你做了很多.

使用您的示例,假设您有此标记:

@Helpers.testListBox("mylist" "1,2,3,4,5,6,7")
Run Code Online (Sandbox Code Playgroud)

它呈现HTML并需要jQuery脚本.你会渲染这个:

// HTML for list box here

<script type="text/javascript>
require(['jquery'], function($) {
  // Do your jQuery coding here:
  $("myList").doSomething().whatever();
});
</script>
Run Code Online (Sandbox Code Playgroud)

require函数将加载jQuery,除非它已被加载,然后执行您的代码.确实,每次使用HTML帮助程序时,您的jQuery代码段都会重复一次,但这并不是什么大问题.该代码应该简短.

RequireJS有效地管理依赖关系; 您可以拥有模块A,模块B依赖于A,模块C依赖于B.当您的客户端代码请求模块C时,A和B将与C一起加载,并且顺序正确,并且只有一次每.此外,除了require.js的初始加载外,脚本是异步加载的,因此脚本加载不会延迟页面呈现.

当您需要在Web服务器上部署站点时,有一个工具可以检查Javascript文件之间的依赖关系,并将它们组合成一个或少量文件,然后将它们最小化.您的标记都不得改变.在开发过程中,您可以使用大量小型模块化Javascript文件以便于调试,并且在部署时,它们会被组合并最小化以提高效率.

这比Web表单框架做得好得多,而且完全是客户端,在我看来它属于它.