He tratado de usar ASP.NET MVC por un tiempo, luego me enfrenta un problema que no quiero 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?Script & CSS Registration Helper en ASP.NET MVC?
Respuesta
La plantilla de página maestra predeterminada incluye un Content PlaceHolder para el encabezado. Si no es así se puede añadir fácilmente uno:
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server" />
</head>
Sus puntos de vista a continuación, puede 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>
técnicamente debe 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ía hacer esto sería incluir el javascript en el VIewData y tener ViewData en la página maestra (no es una gran solución).
No parece que haya una opción sencilla 'incorporado en el marco de ASP.NET MVC por el momento. 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 he creado 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 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. Cada vez que desee añadir un nuevo guión en el ascx (o aspx para el caso) puede hacerlo de esta manera:
<%
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>
Luego hay que recordar a la salida una vez que haya terminado. Esto se consigue haciendo que la siguiente llamada en el lugar de la página en la que desea dar salida a las etiquetas de script:
<%=Html.RenderScripts() %>
parece funcionar hasta el momento para mí. Casi esperaba tener problemas de renderización dependiendo de en qué punto se llamara RenderScripts, especialmente si no se hubieran 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.
@Jason: ADVERTENCIA, no debería utilizar 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. Ver http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx para más.
Gracias por el aviso: aprendes algo nuevo todos los días. Cambié el código de acuerdo con tus comentarios. – Jason
La propiedad estática en cuestión es una referencia a HttpContext.Items (que es específica del contexto de solicitud, según su enlace, no una variable de miembro estática. Es relativamente seguro, a menos que se creen manualmente múltiples subprocesos que accedan a este miembro estático, en En ese caso, sería apropiado un bloqueo en los elementos de contexto actuales (lo mismo para el diccionario, o use un ConcurrentDictionary). – Tracker1
Aquí es una solución similar a la que dio a Jason, pero toma los comentarios de vdh_ant en consideración:
http://frugalcoder.us/post/2009/06/29/Handling-Scripts-in-ASPNet-MVC.aspx
MVC Futuros ahora se ha construido en ayudantes de este ...
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,
Me tomó un vistazo a su blog en Html.Css y Html.Script ayudantes. 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 soluciona esto, por favor corríjanme con alguna aclaración.
--Regards, Ken
escribí sólo un administrador de tales para MVC, y escribió sobre ello en mi blog:
"JavascriptHelper–Managing JS files for ASP.NET MVC"
ACTUALIZACIÓN: He añadido la agrupación: "JavascriptHelper:Managing JS files for ASP.NET MVC (With Bundling)"
- 1. Asp.Net MVC Html Helper Extension
- 2. ASP.NET MVC - llamando a Razor @helper desde otro @helper
- 3. Obtenga DisplayName Attribute sin utilizar LabelFor Helper en asp.net MVC
- 4. ¿Por qué usamos HTML helper en ASP.NET MVC?
- 5. Necesita ayuda para crear Custom Html Helper para Asp.net MVC
- 6. ¿Es posible crear un ASP.NET MVC personalizado fuertemente HTML Helper?
- 7. Autoversioning CSS/JS en ASP.NET MVC?
- 8. CSS y Javascript ruta relativa confusión en ASP.NET MVC
- 9. ASP.NET - compresión de script y css
- 10. Combinación y minificación de JS y CSS en ASP.NET MVC
- 11. Auto-versioning en ASP.NET MVC para archivos CSS/JS?
- 12. ASP.Net MVC 2 - Necesita agregar una propiedad predeterminada a un Html.Textbox Helper fuertemente tipado En Asp.Net MVC 2
- 13. asp.net mvc agregar css a editorfor?
- 14. ayudantes HTML Styling ASP.NET MVC
- 15. ASP.NET MVC agregar clase css a actionlink
- 16. Lesscss y ASP.NET MVC
- 17. Cómo deshabilitar la función de autocompletar en MVC Html Helper
- 18. Cómo usar Ajax.BeginForm MVC helper con resultado JSON?
- 19. crear un helper html para mvc
- 20. Bundle Script y CSS de Resources in Assemblies for MVC
- 21. ¿Cómo aplico una clase CSS a Html.ActionLink en ASP.NET MVC?
- 22. Tener navaja @helper en la carpeta App_code utilizando ASP.NET MVC 3
- 23. ¿Cómo se establece el ancho de un HTML Helper TextBox en ASP.NET MVC?
- 24. ¿Cómo cambiar el valor de identificación cuando se usa Html.DropDownListFor helper en asp.net mvc 2.0?
- 25. ¿Cómo crear un texto de solo lectura usando html helper en asp.net mvc?
- 26. Evitando que ASP.NET MVC reemplace el período con guión bajo en Html Helper IDs
- 27. ASP.NET MVC AJAX Calendario
- 28. ASP.NET MVC3 CSS Framework
- 29. ASP.net MVC estructura del proyecto
- 30. ASP.net MVC y jQueryUI dilema
¿No se trata de ASP.NET MVC y no de formularios web? –
El motor Razor view se lanzó con MVC 3. Es decir * versión 3 *, ya que en dos versiones completas del producto se lanzaron antes de que se desarrollara/incluyera Razor. Antes de Razor, el motor de vista predeterminado era ASPX. – sliderhouserules