给定 MVC3 和 Razor 引擎,我得到
_MasterLayout.cshtml
@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..
查看.cshtml_MasterLayout.cshtml 在 _ViewStart.cshtml 中定义
..
@Html.RenderAction("PartialView", "PartialController")
..
PartialView.cshtml
..
@section JavaScript
{
........
}
..
如何确保部分视图中的 JavaScript 最终出现在主布局部分?
Edit
上述场景不起作用,因为分部视图没有定义主布局。另一方面,View 确实具有定义了 RenderSection 的 Layout。如果我将 JavaScript 部分从“部分视图”移动到“视图”,Razor 知道将其渲染到哪里。但是,由于分部视图没有布局,它不知道如何处理 JavaScript 部分,因此不会在任何地方呈现它。
我创建了一组扩展方法来将脚本块(或任何内容)从部分渲染到主布局中。
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());
}
}
然后就可以这样使用:
@this.ScriptBlock(
@<script type='text/javascript'>
$(document).ready(function () {
notify('@message', '@Model.Type.ToString()',
'@Model.Type.ToString().ToLower()');
});
</script>)
然后在主布局中渲染:
@this.WriteScriptBlocks()
在这里查看完整的文章:Razor Partials 中内联脚本的脚本块模板化委托 http://blog.logrythmik.com/post/A-Script-Block-Templated-Delegate-for-Inline-Scripts-in-Razor-Partials.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)