Asp.net-Mvc-3

如何從局部視圖將 JavaScript 渲染到 MasterLayout 部分?

  • May 12, 2011

給定 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 中內聯腳本的腳本塊模板化委託

引用自:https://stackoverflow.com/questions/5981490