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