Включение бритвенного участка с частичным видом - PullRequest
2 голосов
/ 11 марта 2012

У меня есть раздел для скриптов в моем _Layout.cshtml:

<html>
    <body>
    ...
        @RenderSection("FooterScript", required: false)
    </body>
</html>

У меня есть представление "Index.cshtml", которое содержит @Html.RenderPartial("LinksBlock", someModel). Частично для LinksBlock требуется файл сценария "links.js". Я хочу включить links.js в FooterScript из моего частичного представления, а не из основного вида (основной вид не знает о зависимостях частичного представления), и я хочу быть уверенным, что если я использую более 1 LinksBlock в моем просмотр, только 1 links.js был включен. Возможно ли это?

1 Ответ

14 голосов
/ 12 марта 2012

Разделы не работают с частичными представлениями.Но вы могли бы написать пару пользовательских помощников, которые могли бы использоваться вместе:

public static class HtmlExtensions
{
    public static IHtmlString RegisteredScripts(this HtmlHelper htmlHelper)
    {
        var ctx = htmlHelper.ViewContext.HttpContext;
        var registeredScripts = ctx.Items["_scripts_"] as Stack<string>;
        if (registeredScripts == null || registeredScripts.Count < 1)
        {
            return null;
        }
        var sb = new StringBuilder();
        foreach (var script in registeredScripts)
        {
            var scriptBuilder = new TagBuilder("script");
            scriptBuilder.Attributes["type"] = "text/javascript";
            scriptBuilder.Attributes["src"] = script;
            sb.AppendLine(scriptBuilder.ToString(TagRenderMode.Normal));
        }
        return new HtmlString(sb.ToString());
    }

    public static void RegisterScript(this HtmlHelper htmlHelper, string script)
    {
        var ctx = htmlHelper.ViewContext.HttpContext;
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var registeredScripts = ctx.Items["_scripts_"] as Stack<string>;
        if (registeredScripts == null)
        {
            registeredScripts = new Stack<string>();
            ctx.Items["_scripts_"] = registeredScripts;
        }
        var src = urlHelper.Content(script);
        if (!registeredScripts.Contains(src))
        {
            registeredScripts.Push(src);
        }
    }
}

А затем в вашем _Layout.cshtml:

@Html.RegisteredScripts()

и в вашем частичном:

@{Html.RegisterScript("~/scripts/foo.js");}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...