仅当Javascript尚未包含在.NET MVC中时才包含Javascript

时间:2012-01-22 18:44:41

标签: c# model-view-controller asp.net-mvc-2

在.NET MVC局部视图中,我想做类似的事情:

<% ScriptCollection.RequireScript("path/to/script.js"); %>

这需要ScriptCollection对象中的方法如下所示:

public void RequireScript(string src)
{
    if (!_List.Contains(src))
        _List.Add(src);
}

然后,在我的母版页面中,我会有这样的事情:

<html>
<head></head>
<body>

    <!-- Content would go here -->

    <% foreach (var script in ScriptCollection) { %>
        <script type="text/javascript" src="<%= script %>"></script>
    <% } %>

</body>
</html>

我的问题是: 如何使ScriptCollection对象可以通过部分视图更新,也可以由主页面使用?

编辑: 我不想在控制器中添加所需的脚本,也不想使用强类型的母版页。虽然这些方法被认为是最佳实践,但欢迎这样做的建议。

编辑#2: 这对于扩展属性来说很容易。我可以给HtmlHelperScriptCollection属性。我是否遗漏了已存在的类似内容?

2 个答案:

答案 0 :(得分:1)

我检查了Telerik组件。他们对我的需求有点过分。此外,开源许可证(GPL v2)不是我正在寻找的类型。

我启动了一个根据麻省理工学院开源许可证授权的项目,并将其托管在Google Code上。这是解决我问题的轻量级解决方案。

code.google.com/p/script-keeper

答案 1 :(得分:0)

您可以查看Telerik的ScriptRegisterBuilder类实现,它可以完全满足您的需求。或者你也可以使用它。此外,它还支持:

  1. 将多个JS文件合并为一个,导致浏览器请求减少。
  2. 压缩JS文件。
  3. HTTP缓存。
  4. 内容分发网络。
  5. 根据您的构建模式发布/调试JS资源的版本。
  6. 现在,即使您不使用Telerik提供的任何其他内容,您也可以使用ScriptRegisterBuilder类,但建议您禁用自动jquery&amp; jquery验证脚本注册。另见提供的链接。

    另请查看StyleSheetRegistrarBuilder课程。这是ScriptRegisterBuilder类的侄子并处理CSS资产。

    我在你的问题中注意到了MVC2标签,但我的简单例子使用了剃刀,只是为了说明问题。使它适用于MVC2 / ASPX应该不难。否则请告诉我。

    大师

    @using Telerik.Web.Mvc.UI
    <!DOCTYPE html>
    <html>
    <head>
        <title>@ViewBag.Title</title>  
        @Html.Telerik().StyleSheetRegistrar().DefaultGroup(group => group.Add("~/Content/Site.css"))  
    </head>
    <body>
        @RenderBody()
    
        @Html.Telerik().ScriptRegistrar().jQuery(false).jQueryValidation(false)    
    </body>
    </html>
    

    部分视图

     @using Telerik.Web.Mvc.UI
     @{
       ViewBag.Title = "Home Page";
       Html.Telerik().StyleSheetRegistrar().DefaultGroup(group => group.Add("~/Content/Site2.css"));
       Html.Telerik().ScriptRegistrar().DefaultGroup(group => group.Add("~/Scripts/Test.js"));
      }
    
      <h2>@ViewBag.Title</h2>
      <p>
         Bla bla bla
      </p>