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

Sam*_*ang 10 asp.net-mvc

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

sli*_*les 10

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

<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server" />
</head>
Run Code Online (Sandbox Code Playgroud)

然后,您的观点可以将他们想要的任何内容放在头部:

<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>
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 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();
}
Run Code Online (Sandbox Code Playgroud)

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

<%
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>
Run Code Online (Sandbox Code Playgroud)

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

<%=Html.RenderScripts() %>
Run Code Online (Sandbox Code Playgroud)

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