Asp.net-Mvc-3
如何從局部視圖將 JavaScript 渲染到 MasterLayout 部分?
給定 MVC3 和 Razor 引擎,我得到了
_MasterLayout.cshtml
@RenderSection("JavaScript", required: false) .. .. @RenderBody() ..View.cshtml和 _MasterLayout.cshtml 在 _ViewStart.cshtml 中定義
.. @Html.RenderAction("PartialView", "PartialController") ..部分視圖.cshtml
.. @section JavaScript { ........ } ..如何確保局部視圖中的 JavaScript 最終出現在主佈局部分?
編輯
上述場景不起作用,因為局部視圖沒有定義主佈局。另一方面,視圖確實具有定義了 RenderSection 的佈局。如果我將部分 JavaScript 從 Partial View 移動到 View,Razor 知道將其渲染到哪裡。但是,由於局部視圖沒有佈局,它不知道如何處理部分 JavaScript,因此不會在任何地方呈現它。
我不相信部分視圖可以設置要在佈局頁面中使用的部分:(
看起來沒有很好的解決方案 - 您可以包含兩個部分(一個用於腳本,一個用於內容):
<script stuff> @Html.RenderAction("PartialViewScripts", "PartialController") </script stuff> <body stuff> @Html.RenderAction("PartialView", "PartialController") </body stuff>
我創建了一組擴展方法來將腳本塊(或任何東西)從部分渲染到主佈局中。
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 中內聯腳本的腳本塊模板化委託