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

时间:2012-02-08 15:27:39

标签: c# asp.net-mvc-3 model-view-controller html-helper razor-declarative-helpers

我在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?

}

3 个答案:

答案 0 :(得分: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>

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

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

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

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

// HTML for list box here

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

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

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

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

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

答案 1 :(得分:0)

您可以在帮助程序正文中添加<script>标记。

答案 2 :(得分:0)

对于局部视图的示例,这是怎么回事:

@model Member.CurrentMemberModel
@{

    var title = "Test View";
}

        <script type="text/javascript">
            // Javascript goes in here, you can even add properties using "@" symbol
            $(document).ready(function () {
                //Do Jquery stuff here
            });
        </script>

@if (currentMember != null)
{
     <div>Hello Member</div>
}
else
{
    <div>You are not logged in</div>
}