2014-03-06 59 views
1

我有一個孩子的行動相當密集通話時需要的,用在一些看法簡稱C#代碼的巨量Javascript文件:做什麼用的渲染一個asp.net MVC ChildAction

@Html.RenderPartial("mychildAction") 

現在我需要加載一些javascript文件,每當這個動作被調用。我不能把標籤內聯(視圖內),因爲Jquery(和其他JS庫)直到html頁面結束才加載。

(主)_layout應該知道這個ChildAction被調用。但這不是因爲一個Child Action獲得一個新的HttpContext。

我想出的唯一解決方案是切換到部分(包括一大塊C#代碼到局部區域,並將一些字符串添加到保存在HttpContext.Current.Items中的一些自定義對象,並使我的_Layout適當行動)。但是這樣做意味着我在這個ChildAction上沒有輸出緩存,並且拋出了像partials中的代碼這樣的不好的做法。

處理這種情況的最佳方法是什麼?

+0

放的jQuery。我見過其他人說,現在的瀏覽器已經具備了處理這個問題的能力,並且將腳本放在文檔的末尾不再會提高加載速度。 – ps2goat

回答

0

您可以訪問的HttpContext使用

Html.ViewContext.ParentActionViewContext 

這樣一個可以添加一些東西到「項目」集合有調用動作,這種方法可以解決這個particuliar問題,但我仍然不知道這是最好的做法。

0

該視圖負責渲染腳本,並且由於視圖知道何時渲染局部視圖,因此它知道何時爲其呈現腳本。

在你的佈局你會發現這一點:

@RenderSection("scripts", required: false) 

視圖可以有加載腳本是這樣的:

@section Scripts 
{ 
    @Scripts.Render("~/bundles/SomeBundle") 
} 

這允許調用視圖渲染腳本。

什麼是不可能是從部分視圖或子視圖呈現腳本。

您可能會發現一些有關如何從部分視圖呈現腳本的解決方法,但通常視圖的責任是知道要加載哪些腳本。

編輯

一些我見過的解決方法是here

+1

我不認爲你可以在ChildAction中渲染節...(與你提到的部分視圖相同)。問題仍然有效,_Layout如何知道如何使用部分腳本來加載腳本。 – dampee

+0

@dampee視圖將呈現腳本。這是做到這一點的方法。 – Odys

+0

然後最佳做法是什麼?你把你的方法放在ChildActionOnly標記的方法中,還是放在被調用的視圖中? – dampee

-1

我@Odys同意在​​``標籤

_Layout.cshtml

@RenderSection("scripts", required: false) 

ChildView

@{ 
    Layout = "~/Views/Share/_Layout.cshtml" 
} 
@section scripts 
{ 
    <script></script> 
} 
+0

當你使用Html.Action(「method」)時,你不能使用部分!這就像試圖使用Partial中的部分。 – dampee