C# 尝试从局部视图向MVC3Razor网站中的布局文件添加JS和CSS
我目前正在使用一种类似于以下代码的方法将脚本和css文件添加到布局文件的头部C# 尝试从局部视图向MVC3Razor网站中的布局文件添加JS和CSS,c#,asp.net,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc 3,Razor,我目前正在使用一种类似于以下代码的方法将脚本和css文件添加到布局文件的头部 public static class HtmlHelperExtensions { public static MyCompanyHtmlHelpers MyCompany(this HtmlHelper htmlHelper) { return MyCompanyHtmlHelpers.GetInstance(htmlHelper); } } public clas
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>";
}
公共静态类HtmlHelperExtensions
{
公共静态MyCompanyHtmlHelpers MyCompany(此HtmlHelper HtmlHelper)
{
返回MyCompanyHtmlHelpers.GetInstance(htmlHelper);
}
}
公共类MyCompanyHtmlHelpers
{
私有静态MyCompanyHtmlHelpers\u实例;
公共静态MyCompanyHtmlHelpers GetInstance(HtmlHelper HtmlHelper)
{
if(_instance==null)
_instance=new MyCompanyHtmlHelpers();
_SetHtmlHelper(htmlHelper);
返回_实例;
}
私人HtmlHelper_HtmlHelper;
公共项注册器样式{get;private set;}
公共项注册器脚本{get;private set;}
公共MyCompanyHtmlHelpers()
{
Styles=新的ItemRegistrar(ItemRegistrarFromatters.StyleFormat);
Scripts=新的ItemRegistrar(ItemRegistrarFromatters.ScriptFormat);
}
私有void SetHtmlHelper(HtmlHelper HtmlHelper)
{
_htmlHelper=htmlHelper;
}
}
公共类项目注册器
{
私有只读字符串\u格式;
私有只读列表项;
公共项目注册器(字符串格式)
{
_格式=格式;
_项目=新列表();
}
公共项目注册器添加(字符串url)
{
如果(!\u items.Contains(url))
_项目。插入(0,url);
归还这个;
}
公共IHtmlString Render()
{
var sb=新的StringBuilder();
foreach(var项目在_项目中)
{
var fmt=string.Format(_Format,item);
sb.附录(fmt);
}
返回新的HtmlString(sb.ToString());
}
}
公共类ItemRegistrarFromatters
{
public const string StyleFormat=“”;
public const string ScriptFormat=“”;
}
使用Html.MyCompany().Styles.Add(“/Dashboard/Content/Dashboard.css”)代码>要添加文件。。。
和@Html.MyCompany().Styles.Render()
以在Layout.cshtml中呈现它们
我的问题是,这是一个静态方法,意味着它会持久化样式表和脚本文件的列表
我需要做与此相同的事情,但不保持它的持久性
我需要在每次请求时重新制作列表,因为它们会随着页面的变化而变化,特定页面上的外观是什么
在添加所需的脚本之前,或者在脚本渲染之后,是否可以清除每个请求上的列表
更新:
不使用节、RenderPartial或RenderActions的原因是为了防止同一样式表或脚本文件多次添加到布局文件中
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>";
}
站点im建筑有一个带有基本布局的布局.cshtml。这反过来又被一个在项目列表中循环的视图所使用,对于每个项目,都会调用一个RenderAction来输出该项目的特定局部视图。这些局部视图有时需要添加样式表和脚本
由于可能需要从不同的局部视图添加许多不同的脚本和样式表,因此我认为唯一可以这样做的方法是创建一个全局样式和脚本列表,因此有一个全局位置来检查脚本是否已准备好添加到集合中,然后按照添加的顺序一次性呈现它们
更新2:
真正的问题是如何在不使用静态扩展方法的情况下执行相同类型的函数(全局列表)。您需要做的是以稍微不同的方式扩展Html帮助程序
public static MvcHtmlString AddStyle(this HtmlHelper<TModel> html, string styleUrl)
{
string styleTag = string.Format("<link rel='stylesheet' type='text/css' href='{0}' />", styleUrl);
return MvcHtmlString.Create(styleTag);
}
public static MvcHtmlString AddStyle(此HtmlHelper html,字符串样式URL)
{
string styleTag=string.Format(“,styleUrl”);
返回MvcHtmlString.Create(styleTag);
}
那么在你看来,只要做:
<head>
@Html.AddStyle("/Dashboard/Content/Dashboard.css")
</head>
@AddStyle(“/Dashboard/Content/Dashboard.css”)
如果需要根相对Url,只需加入Url内容帮助器
<head>
@Html.AddStyle(Url.Content("~/Dashboard/Content/Dashboard.css"))
</head>
@AddStyle(Url.Content(“~/Dashboard/Content/Dashboard.css”))
我会用节来做这件事,即
@section head {
...add whatever you want here...
}
并从布局中渲染“头部”部分:
<head>
...other stuff here...
@RenderSection("head", required: false)
</head>
那个静电场注定要失败!不要那样做。。。看…我不太清楚你为什么要这样做?你不能用节、渲染部分或渲染来实现这一点吗?是的,静态是我从中学到的纯粹的邪恶,但我有的选项并不多:)我仍然认为我需要一个脚本和样式表的全局列表,以便能够以良好的方式维护它。使用@Url.Content()只包含你需要的那些不是更容易吗
在父视图中?@Marc:节定义前面缺少一个@。除此之外,投赞成票:)如果我可以在局部视图中定义由我在视图中使用的渲染创建的部分,这可能会起作用,但是否真的有某种方法可以检查脚本或样式表是否已添加到部分?@Daniel-啊,我明白了;是的,因为您希望将它们收集到一个列表或其他东西中,例如使用HttpContext方法——只需丢失该静态变量;pYes那么问题是如何做到这一点:)如果我放弃静态的decelleration,它就不起作用了,因为扩展方法必须是静态的。@Daniel该方法应该是静态的;正是这个静电场让我做噩梦。你需要丢掉它。真正地在http上下文中根据已知键存储列表(或其他内容)。这如何从局部视图将样式添加到布局文件中?我没有误解您的问题。