2015-05-06 44 views
1

我用這個答案來延緩諧音/編輯腳本的渲染: https://stackoverflow.com/a/14127332/1612788如何延遲呈現部分視圖中的腳本,除非它是ajax?

這依賴於在

@using (Html.BeginScripts()) 
{ 
    <script> 
     var foo = "Bar"; 
    </script> 
} 

封閉所需的腳本,當部分與其他部分同步加載這個偉大的工程的頁面。但是,當從ajax請求調用partial時,它不會在響應中呈現腳本。

有沒有一種方法可以告訴它在Html.BeginScripts是同步請求時使用Html.BeginScripts,並且當它是異步請求時忽略Html.BeginScripts?換句話說,我只是想在正常情況下通過ajax請求部分腳本。

我大概可以做這樣的事情:

@if (Request.IsAjaxRequest()) 
{ 
    <script> 
     var copy = "Bar"; 
    </script> 
} 
else 
{ 
    using (Html.BeginScripts()) 
    { 
     <script> 
      var copy = "Bar"; 
     </script> 
    } 
} 

但是,有沒有辦法這樣可以不必在源腳本的兩個副本做什麼?

+0

我不是100%確定你的目標,但下面的例子適用於我認爲你的想法。讓我知道,如果它不適合你,因爲它可以調整:) –

+0

其實它有點關閉。區別不在於是將部分渲染爲部分渲染還是將其作爲完整渲染而不是佈局渲染,而是我是否同步渲染局部渲染(同時充滿布局)或異步渲染(完整渲染之後視圖已經被渲染了,我只是通過ajax注入部分)。我*希望腳本部分與html一起輸出,以便通過Ajax請求它 – Tevis

+0

我瞭解您的問題,並努力解決相同的問題。在引用中的腳本而不是在主體結尾處是我到目前爲止唯一的解決方案。如果你找到了另一個解決方案,請分享。 –

回答

0

只需在視圖中定義一個scripts部分並將腳本放入該部分即可。

@section Scripts { 

    <script> 
     var copy = "Bar"; 
    </script> 
} 

如果視圖是與渲染部分的佈局呈現,

例如在您的佈局文件中:

@RenderSection("scripts", required: false) 

它會出現,如果它被渲染爲部分視圖則不會。

我做的另一件事是通過ViewBag設置來設置佈局,以便控制器決定是以完整視圖還是部分視圖呈現完整視圖。

每個視圖都包含在上面這段代碼:

Layout = ViewBag.Layout 

在控制器的動作你做你的檢查:

if (!Request.IsAjaxRequest()) 
{ 
    ViewBag.Layout = MyLayoutNameHere; 
} 
return PartialView(); 

你總是那麼使用PartialView和Layout =的presense決定是否渲染作爲一個全景。

爲了方便起見,我最終把這段代碼放在一個基礎控制器中。