2012-04-21 38 views
4

我正在編寫一個MVC應用程序,並且我已經決定Knockout.js會幫助解決很多我的問題,除了在這個過程中,它創建了一個新問題,我有問題解決。MVVM MVVM通過敲除,將模型傳遞給j​​avascript

我將所有MVC端點轉換爲僅僅返回視圖,然後創建了其他幾個返回JSON對象的端點。當用戶瀏覽網站時,該網站加載基本的UI框架。之後,Knockout.js通過AJAX調用加載模型。這導致每個頁面加載,然後再次「加載」,就像加載頁面的MVC和所有數據一樣。

我一直在尋找方法來同時加載,但我還沒有發現任何不需要我完全重構該網站。最好的辦法是:

  • 合併JSON端點到視圖端點和使用@Html.Raw(Json.Encode(object))

模型轉換成JSON的代碼隱藏,但後來我不得不讓我所有的純JSON端點的車程。

我還有什麼可以將JSON端點數據傳遞給服務器端的視圖嗎?或者有什麼方法讓模型和視圖同時加載?

回答

3

您的體系結構是正確的,但您希望初始加載使用模型中的數據預填充您的視圖。在剛剛返回視圖的控制器操作中,應該將數據填充到ViewData中。然後視圖最初加載模型值,每個UI元素可以有一個AJAX更新,調用該特定字段的Controller操作。

這也將是ideal case for a ViewModel。這可能有助於as well

+0

謝謝你的回答!爲了確保我在同一頁面上,我應該在視圖內部調用JSON端點?像這樣:var model = @ Html.Action(「Data」,「Items」)模型在js中? – 2012-04-21 21:26:54

+0

只調用JSON端點進行更新。如果你創建一個ViewModel對象並在Javascript中與它進行交互,你應該只有視圖與該對象交互,並且擁有封裝AJAX請求的方法(使用Controller端點)。這將使您能夠定期執行諸如緩存或更新之類的智能功能。 – 2012-04-21 22:54:53

+0

好的,所以我的視圖端點應該返回一個被翻譯成JavaScript的模型,我應該有返回該模型的更新版本的json端點?我能做些什麼來消除代碼重複我是這種情況? – 2012-04-22 00:49:56

1

我也同意,讓您的初始視圖生成將初始數據直接渲染到視圖中是一個好主意。一般來說,這會產生比單獨的AJAX調用+ JavaScript之後填充數據更好的性能。

但我也認爲這取決於您正在加載的頁面的類型。如果你的應用主要是基於AJAX的(SPA風格模型),那麼第一次加載可能不是那麼重要,因爲它只發生一次,並且可能需要一些額外的時間。通過AJAX或通過傳統的View操作以單向方式加載所有數據會更輕鬆,更一致。當您的客戶端代碼要求您重新加載列表或記錄的整個數據集時,最終不會複製模板/視圖邏輯以生成該輸出。