gpt4 book ai didi

c# - 尝试从局部 View 将 JS 和 CSS 添加到 MVC 3 Razor 网站中的布局文件

转载 作者:太空狗 更新时间:2023-10-29 20:11:36 25 4
gpt4 key购买 nike

我目前正在使用类似于以下代码的方法将脚本和 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_.cshtml。这又被循环遍历项目列表的 View 使用,并且对于每个项目,调用 RenderAction 输出该项目的特定部分 View 。这些部分 View 有时需要添加样式表和脚本。

因为可能需要从不同的局部 View 添加许多不同的脚本和样式表,所以我认为样式和脚本的全局列表是唯一可以做到这一点的方法,所以有一个全局位置可以检查脚本是否已添加是否添加到集合中,然后按照添加的顺序一次渲染它们。

更新 2:真正的问题是如何在不使用静态扩展方法的情况下执行相同类型的功能(全局列表)。

最佳答案

我会用部分来做到这一点,即

@section head {
...add whatever you want here...
}

并从布局中渲染“head”部分:

<head>
...other stuff here...
@RenderSection("head", required: false)
</head>

如果您不想要部分,也不想传递它,我会在这里使用 HttpContext;针对 HttpContext.Current.Items[someKey] 存储一些数据。如果为空,则创建一个新的并将其存储在上下文中。

例如:

public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper)
{
const string key = "MyCompanyHtmlHelpersInstance";
IDictionary items = (htmlHelper == null || htmlHelper.ViewContext == null
|| htmlHelper.ViewContext.HttpContext == null)
? HttpContext.Current.Items : htmlHelper.ViewContext.HttpContext.Items;

MyCompanyHtmlHelpers obj = (MyCompanyHtmlHelpers)items[key];
if (obj == null)
{
items.Add(key, obj = new MyCompanyHtmlHelpers());
}
return obj;
}

关于c# - 尝试从局部 View 将 JS 和 CSS 添加到 MVC 3 Razor 网站中的布局文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5312759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com