从局部视图向页面指定区域注入内联JS脚本的实现问题
问题解决思路
你代码里的核心问题是:调用Html.Script(inlineCode, "head")或Html.Script(inlineCode, "bottom")时,只执行了方法却没有输出它的返回值。在Razor视图中,HtmlHelper方法返回的MvcHtmlString必须加上@前缀,才能把内容渲染到响应流里,否则等于白执行。
修正后的代码
给内联脚本分支里的Html.Script调用加上@前缀即可:
@if (scriptType == "reference") { if (position == "Head") { @Html.Script(fileUrl, "head"); } if (position == "DropedPosition") { <text> <script src="@fileUrl" type="text/javascript"></script> </text> } if (position == "BeforeClosingBodyTag") { @Html.Script(fileUrl, "bottom"); } } else // script type is inLine { if (position == "Head") { @Html.Script(inlineCode, "head"); } if (position == "DropedPosition") { <text> <script type="text/javascript"> @Html.Raw(inlineCode) </script> </text> } if (position == "BeforeClosingBodyTag") { @Html.Script(inlineCode, "bottom"); } }
额外检查点
- 确认你的
Html.Script助手确实有接受内联字符串和位置的重载。如果该助手仅支持脚本文件路径,需要自己扩展一个支持内联脚本的版本,或者改用布局页@section的方式:- 在布局页的
<head>标签内添加@RenderSection("HeadScripts", required: false),局部视图里写@section HeadScripts { <script>@Html.Raw(inlineCode)</script> } - 底部区域同理,定义对应的section即可。
- 在布局页的
- 注意:如果局部视图是通过
@Html.Partial嵌套渲染的,部分场景下@section可能无法被布局页捕获,这时还是得依赖Html.Script这类助手来收集脚本,再在布局页统一渲染。
内容的提问来源于stack exchange,提问作者CMartins
相关产品推荐
相关产品推荐

