我曾尝试使用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)
它看起来并不像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,但到目前为止似乎完成了这项工作.如果你最后渲染脚本,那么你应该没有问题.
| 归档时间: |
|
| 查看次数: |
8900 次 |
| 最近记录: |