外部化视图的JavaScript

时间:2011-07-22 03:37:12

标签: javascript asp.net-mvc

我有一个带有内联JavaScript的ASP.NET MVC应用程序,它只适用于特定的视图。

如果我将所有JavaScript放在主布局页面上,我会收到错误消息,因为所有页面上都没有ID。

有没有办法为每个视图外化JavaScript?

4 个答案:

答案 0 :(得分:2)

这是一种方法。这是使用剃刀视图引擎

在head标签之间的布局页面中创建一个部分

<head>
@RenderSection("Head", required: false);
</head>

然后在您的视图中创建一个部分并将脚本标记放入其中。

@section Head
{
     <script type="text/javascript">
         do some java script...
     </script>

}

您还可以引用特定于该页面的外部库,例如灯箱或其他内容。

答案 1 :(得分:1)

如果您使用的是MVC 2,则可以使用内容占位符。

// this goes in your master page in your head tag
<asp:ContentPlaceHolder id="Script" runat="server"/>

// this goes in your view -- not partial
<asp:Content ID="Content1" ContentPlaceHolderID="script" runat="server">
    <script type="text/javascript" src="foo.js"></script>
</asp:Content>

在MVC 3中,您可以this

答案 2 :(得分:1)

我使用HtmlHelper扩展来在每个控制器操作上注册我使用过的脚本,“MasterPage”使用正确的脚本标记呈现每个注册的脚本。

的HtmlHelper:

    public static void RegisterScript(string path)
    {
        if (!HttpContext.Current.Items.Contains("RegisteredScripts"))
            HttpContext.Current.Items.Add("RegisteredScripts", ";" + path);
        else
            HttpContext.Current.Items["RegisteredScripts"] = ";" + path;
    }

    public static MvcHtmlString RegisteredScripts(this HtmlHelper html)
    {
        var lines = new StringBuilder();
        if (html.ViewContext.HttpContext.Items.Contains("RegisteredScripts"))
        {
            foreach (var k in html.ViewContext.HttpContext.Items["RegisteredScripts"].ToString().Substring(1).Split(';'))
            {
                lines.Append(html.Script(k));
            }
        }

        return MvcHtmlString.Create(lines.ToString());
    }

    // Helper-functions
    public static MvcHtmlString Script(this HtmlHelper html, string path)
    {
        if (!ExistsInContext(html, path))
        {
            return Render(html, "<script type=\"text/javascript\" src=\"{0}\"></script>", path);
        }
        return MvcHtmlString.Create("");
    }
    private static bool ExistsInContext(HtmlHelper html, string path)
    {
        return html.ViewContext.HttpContext.Items.Contains(path);
    }

在控制器动作中只需调用:

Helpers.HtmlHelpers.RegisterScript("~/Scripts/custom.js");

希望这有帮助

答案 3 :(得分:0)

javascript可以测试'ID'是否为null或未定义,如果是,则不会触发代码。