Intentando agregar JS y CSS al archivo de diseño en el sitio web MVC 3 Razor desde vistas parciales
Actualmente estoy usando un método que se parece al siguiente código para agregar secuencias de comandos y archivos CSS al encabezado del archivo de diseño.
public static class HtmlHelperExtensions
{
public static MyCompanyHtmlHelpers MyCompany(this HtmlHelper htmlHelper)
{
return MyCompanyHtmlHelpers.GetInstance(htmlHelper);
}
}
public class MyCompanyHtmlHelpers
{
private static MyCompanyHtmlHelpers _instance;
public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper)
{
if (_instance == null)
_instance = new MyCompanyHtmlHelpers();
_instance.SetHtmlHelper(htmlHelper);
return _instance;
}
private HtmlHelper _htmlHelper;
public ItemRegistrar Styles { get; private set; }
public ItemRegistrar Scripts { get; private set; }
public MyCompanyHtmlHelpers()
{
Styles = new ItemRegistrar(ItemRegistrarFromatters.StyleFormat);
Scripts = new ItemRegistrar(ItemRegistrarFromatters.ScriptFormat);
}
private void SetHtmlHelper(HtmlHelper htmlHelper)
{
_htmlHelper = htmlHelper;
}
}
public class ItemRegistrar
{
private readonly string _format;
private readonly List<string> _items;
public ItemRegistrar(string format)
{
_format = format;
_items = new List<string>();
}
public ItemRegistrar Add(string url)
{
if (!_items.Contains(url))
_items.Insert(0, url);
return this;
}
public IHtmlString Render()
{
var sb = new StringBuilder();
foreach (var item in _items)
{
var fmt = string.Format(_format, item);
sb.AppendLine(fmt);
}
return new HtmlString(sb.ToString());
}
}
public class ItemRegistrarFromatters
{
public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />";
public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>";
}
UtilizandoHtml.MyCompany().Styles.Add("/Dashboard/Content/Dashboard.css");
para agregar archivos ... Y@Html.MyCompany().Styles.Render()
para representarlos en Layout_.cshtml.
Mi problema es que este es un método estático, lo que significa que persiste en la lista de hojas de estilo y archivos de script.
ecesito hacer lo mismo que esto pero sin mantenerlo persistente.
Necesito que las listas se vuelvan a crear en cada solicitud, ya que cambian de una página a otra el aspecto de esa página específica.
Es posible borrar las listas en cada solicitud antes de agregar los scripts que se necesitan o tal vez después de que se hayan procesado?
Actualizar La razón para no usar una sección, RenderPartial o RenderaActions es evitar que la misma hoja de estilo o archivo de script se agregue más de una vez al archivo de diseño.
El sitio que estoy construyendo tiene un Layout_.cshtml con el diseño básico. Esto a su vez es utilizado por una Vista que recorre una lista de elementos y para cada elemento se llama RenderAction que genera la vista parcial específica para ese elemento. Estas vistas parciales a veces necesitan agregar hojas de estilo y scripts.
Como puede ser necesario agregar muchos scripts y hojas de estilo diferentes desde diferentes vistas parciales, una lista global de estilos y scripts fue la única forma en que pensé que esto podría hacerse, por lo que hay un lugar global para verificar si un script ya está agregado al colección o no y luego renderizarlos todos a la vez en el orden en que se agregaron.
Actualización 2: La verdadera pregunta es cómo hacer el mismo tipo de función (una lista global) pero sin usar un método de extensión estático.