asp.net-mvc - net - smartadmin template
Script y CSS Registration Helper en ASP.NET MVC? (8)
La plantilla de página maestra predeterminada incluye un Content PlaceHolder para el encabezado. Si no lo hace, puede agregar uno fácilmente:
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server" />
</head>
Tus puntos de vista pueden poner lo que quieran en la cabeza:
<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>
Intenté usar ASP.NET MVC por un tiempo, luego me enfrenté al problema de que no quería incluir todos mis js y css en la página maestra. ¿Pero cómo puedo registrarlo en el jefe de la página maestra desde mi punto de vista específico?
técnicamente debería poner todas sus js en la parte inferior de la página para obtener el mejor rendimiento.
Creo que la única forma en que podrías hacer esto sería incluir el javascript en el VIewData y tener ViewData en la página maestra (no es una gran solución).
@Jason: ADVERTENCIA, no debería usar variables estáticas como esta ... En un contexto web, las variables estáticas se comparten entre todos los usuarios y todas las solicitudes de página. Me sorprende que no hayas tenido problemas con tu código. El principio está bien, pero el código es incorrecto y te dará problemas. En este caso, debe usar System.Web.HttpContext.Current.Items. Consulte http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx para obtener más información.
Aquí hay una solución similar a la que dio Jason, pero tiene en cuenta los comentarios de vdh_ant:
http://frugalcoder.us/post/2009/06/29/Handling-Scripts-in-ASPNet-MVC.aspx
No parece que todavía haya una opción simple ''incorporada'' en el marco MVC de ASP.NET. Si está utilizando un control de usuario (.ascx), que puede ser si está creando controles autónomos que también quieren administrar sus propios requisitos de JavaScript, entonces ni siquiera puede usar los marcadores de posición para ayudarlo.
Al final creé una clase de ayuda y en ella hay un par de métodos:
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();
}
Esa es una forma básica de hacerlo de todos modos para tratar de mostrar la forma en que funciona. Podría mejorarse de muchas maneras, pero en este momento simplemente filtra las solicitudes de inserción de scripts duplicados para usted. Siempre que quiera agregar una nueva secuencia de comandos en el archivo ascx (o aspx para ese asunto) puede hacerlo de esta manera:
<%
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>
Luego, debe recordar dar salida una vez que haya terminado. Esto se logra haciendo la siguiente llamada en el lugar de su página donde desea generar las etiquetas de script:
<%=Html.RenderScripts() %>
Parece que funciona hasta ahora para mí. Casi esperaba tener problemas de representación dependiendo de en qué momento se llamara RenderScripts, especialmente si no se habían llamado todos los aún, pero hasta ahora parece que hace el trabajo. Si renderizas las secuencias de comandos por último, entonces no deberías tener problemas.
MVC Futures ahora ha incorporado ayudantes para esto ...
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>
Más información aquí: http://blog.osbornm.com/archive/2009/10/12/mvc-script-css-helpers.aspx
Mathew,
Eché un vistazo a tu blog en Html.Css y Html.Script helpers. No me refiero a ser crítico, pero no veo ninguna mención en el blog sobre cómo los ayudantes de Css y Script abordarían el problema discutido aquí. El problema aquí es uno de necesitar referencias de scripts "registradas" en cualquier punto durante el proceso de renderizado, y posiblemente varias veces (en el caso de una plantilla o vista parcial que se usa varias veces y registra sus propios scripts), y luego generar los resultados agregados, sin duplicados, en una sola ubicación.
Si su solución aborda esto, por favor corríjanme con alguna aclaración.
--Regards, Ken
Escribí tal gestor para MVC y escribí sobre él en mi blog:
"JavaScriptHelper-Managing JS files for ASP.NET MVC"
ACTUALIZACIÓN: agregué empaquetado: "JavascriptHelper: Administración de archivos JS para ASP.NET MVC (con Bundling)"