在_Layout.cshtml文件中,我在主体底部有一个名为“ScriptsContent”的部分,声明如下:
@RenderSection("ScriptsContent", required: false)
在我看来,然后我可以使用此部分添加要执行的脚本。但是,如果我还有一个PartialView,也需要使用此部分添加其他脚本怎么办?
查看
@section ScriptsContent
{
<script type="text/javascript">
alert(1);
</script>
}
@Html.Partial("PartialView")
PartialView
@section ScriptsContent
{
<script type="text/javascript">
alert(2);
</script>
}
结果
仅第一个脚本被渲染。该网页的源代码中不存在第二个脚本。
Razor似乎只输出他看到的第一个@section ScriptsContent。我想知道的是,是否有一种方法可以将每个调用合并到该部分。
如果我们不能做到这一点,您有什么建议?
感谢您的帮助!
更新
我找到了一些解决问题的代码。看到我的answer below。
最佳答案
这是该问题的解决方案。来自此博客:http://blog.logrythmik.com/post/A-Script-Block-Templated-Delegate-for-Inline-Scripts-in-Razor-Partials.aspx
public static class ViewPageExtensions
{
private const string SCRIPTBLOCK_BUILDER = "ScriptBlockBuilder";
public static MvcHtmlString ScriptBlock(this WebViewPage webPage, Func<dynamic, HelperResult> template)
{
if (!webPage.IsAjax)
{
var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] as StringBuilder ?? new StringBuilder();
scriptBuilder.Append(template(null).ToHtmlString());
webPage.Context.Items[SCRIPTBLOCK_BUILDER] = scriptBuilder;
return new MvcHtmlString(string.Empty);
}
return new MvcHtmlString(template(null).ToHtmlString());
}
public static MvcHtmlString WriteScriptBlocks(this WebViewPage webPage)
{
var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] as StringBuilder ?? new StringBuilder();
return new MvcHtmlString(scriptBuilder.ToString());
}
}
因此,在您的View或PartialView中的任何地方都可以使用此代码:
@this.ScriptBlock(
@<script type='text/javascript'>
alert(1);
</script>
)
并在_Layout或MasterView中使用以下命令:
@this.WriteScriptBlocks()
关于asp.net-mvc-3 - 如何在 View 和部分 View (合并)中多次使用“ Razor ”部分而不覆盖它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081009/