局部视图中的剃刀部分夹杂物 [英] Razor section inclusions from partial view
问题描述
我的 _Layout.cshtml 中有脚本部分:
I have section for scripts in my _Layout.cshtml:
<html>
<body>
...
@RenderSection("FooterScript", required: false)
</body>
</html>
我有包含 @Html.RenderPartial("LinksBlock", someModel)
的视图Index.cshtml".LinksBlock 部分需要脚本文件links.js".我想从我的局部视图而不是主视图(主视图不知道局部视图的依赖关系)将 links.js 包含到 FooterScript 中,并且我想确定,如果我在我的视图,只包含 1 个 links.js.可能吗?
I have view "Index.cshtml" that contains @Html.RenderPartial("LinksBlock", someModel)
.
LinksBlock partial requires script file "links.js". I want to make links.js inclusion into FooterScript from my partial view, not from main view (main view don't know about dependencies of partial view), and I want to be sure, that if I use more than 1 LinksBlock in my view, only 1 links.js was included. Is it possible?
推荐答案
部分不适用于部分视图.但是您可以编写一对可以结合使用的自定义助手:
Sections do not work with partial views. But you could write a pair of custom helpers that could be used in conjunction:
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");}
这篇关于局部视图中的剃刀部分夹杂物的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!