我目前使用的方法如下所示,将以下代码添加到布局文件的头部以添加脚本和CSS文件。
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>";
}
使用
Html.MyCompany().Styles.Add("/Dashboard/Content/Dashboard.css");
添加文件...
并使用@Html.MyCompany().Styles.Render()
在Layout_.cshtml中进行呈现。我的问题是这是一个静态方法,意味着它会保留样式表和脚本文件的列表。
我需要做的与此相同,但不需要持久保存它。每次请求都需要重新制作列表,因为它们从页面到页面变化,具体页面上的外观也会发生变化。
是否可以在添加所需的脚本之前或呈现后清除每个请求上的列表?
更新: 不使用部分、RenderPartial或RenderaActions的原因是防止同样的样式表或脚本文件被添加到Layout文件中超过一次。
我正在构建的站点有一个Layout_.cshtml,其中包含基本布局。然后,由一个视图使用循环遍历项目列表,并为每个项目调用RenderAction,以输出该项目的特定部分视图。这些部分视图有时需要添加样式表和脚本。
由于可能需要从不同的部分视图添加许多不同的脚本和样式表,因此全局样式和脚本列表是我认为唯一可以完成此操作的方式,因此有一个全局位置来检查脚本是否已添加到集合中,然后按添加顺序一次性呈现它们。
更新2: 真正的问题是如何执行相同类型的函数(全局列表),但不使用静态扩展方法。
@Url.Content()
包含所需的内容不是更容易吗? - Chris S