脚本& ASP.NET MVC中的CSS注册助手?

时间:2008-11-26 04:37:43

标签: asp.net-mvc

我曾尝试使用ASP.NET MVC一段时间,然后我遇到一个问题,我不想在母版页中包含我的所有js和css。但是如何从我的特定视图中将其注册到母版页的头部?

8 个答案:

答案 0 :(得分:10)

默认母版页模板包含head的Content PlaceHolder。如果没有,您可以轻松添加一个:

<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server" />
</head>

您的观点可以将他们想要的任何东西放在头脑中:

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <script src="Scripts/myScripts.js" type="text/javascript"></script>
    <link href="Styles/myStyles.css" rel="stylesheet" type="text/css" />
</asp:Content>

答案 1 :(得分:5)

对于ASP.NET MVC框架来说,它看起来并不像是一个简单的“内置”选项。如果您正在使用用户控件(.ascx),如果您要创建自包含控件(也想管理自己的JavaScript要求),那么您甚至无法使用占位符来帮助您。

最后我创建了一个帮助器类,其中有几个方法:

private static SortedList<int, string> GetRegisteredScriptIncludes()
{
    var registeredScriptIncludes = System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] as SortedList<int, string>;

    if (registeredScriptIncludes == null)
    {
        registeredScriptIncludes = new SortedList<int, string>();
        System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] = registeredScriptIncludes;
    }

    return registeredScriptIncludes;
}

public static void RegisterScriptInclude(this HtmlHelper htmlhelper, string script)
{
    var registeredScriptIncludes = GetRegisteredScriptIncludes();
    if (!registeredScriptIncludes.ContainsValue(script))
    {
        registeredScriptIncludes.Add(registeredScriptIncludes.Count, script);
    }
}

public static string RenderScripts(this HtmlHelper htmlhelper)
{
    var registeredScriptIncludes = GetRegisteredScriptIncludes();
    var scripts = new StringBuilder();
    foreach (string script in registeredScriptIncludes.Values)
    {
        scripts.AppendLine("<script src='" + script + "' type='text/javascript'></script>");
    }
    return scripts.ToString();
}

无论如何,这是它的基本形式,试图展示它的工作方式。它可以通过多种方式得到增强,但目前它只是为您过滤掉重复的脚本插入请求。无论何时你想在ascx(或aspx)中添加一个新脚本,你都可以这样做:

<%
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>

然后你需要记住在完成后输出它们。这可以通过在页面中要输出脚本标记的位置进行以下调用来实现:

<%=Html.RenderScripts() %>

到目前为止似乎对我有用。我确实有一半期望渲染问题取决于RenderScripts被调用的时间点,特别是如果还没有调用所有的RegisterScriptIncludes,但到目前为止似乎完成了这项工作。如果您最后渲染脚本,那么您应该没有问题。

答案 2 :(得分:4)

@Jason:警告,您不应该使用这样的静态变量...在Web上下文中,静态变量在所有用户和所有页面请求之间共享。我很惊讶你的代码没有遇到麻烦。原则很好,但代码错了,会给你带来麻烦。在这种情况下,您应该使用System.Web.HttpContext.Current.Items。有关详情,请参阅http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

答案 3 :(得分:2)

这是一个类似于Jason给出的解决方案,但需要考虑vdh_ant的评论:

http://frugalcoder.us/post/2009/06/29/Handling-Scripts-in-ASPNet-MVC.aspx

答案 4 :(得分:0)

从技术上讲,您应该将所有j放在页面底部以获得最佳性能。

我认为你能做到这一点的唯一方法就是将vavascript包含在VIewData中,并在主页上显示ViewData(不是一个很好的解决方案)。

答案 5 :(得分:0)

MVC Futures现在已经为此建立了帮助......

1.<head>
2.    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
3.    <%= Html.Css("BlueTheme/site.css") %>
4.    <%= Html.Script("jquery-1.3.2.js") %>
5.</head>

此处提供更多信息:http://blog.osbornm.com/archive/2009/10/12/mvc-script-css-helpers.aspx

答案 6 :(得分:0)

马修,

我看了一下关于Html.Css和Html.Script助手的博客。我并不是说要批评,但我没有在博客中看到任何关于Css和脚本助手如何解决这里讨论的问题的提法。这里的问题是需要在渲染过程中的任何时候“注册”脚本引用,并且可能多次(在模板或部分视图的情况下多次使用并注册其自己的脚本),然后输出聚合结果,没有重复,在一个位置。

如果您的解决方案解决了这个问题,请在澄清之前纠正我。

- 此致 肯

答案 7 :(得分:0)

我为MVC写了这样一位经理,并在我的博客上写了这篇文章:

"JavascriptHelper–Managing JS files for ASP.NET MVC"

更新:我添加了捆绑: "JavascriptHelper:Managing JS files for ASP.NET MVC (With Bundling)"