2009-07-08 162 views
12

我有一個由頂部,左側和底部標題以及主內容窗格組成的視圖。假設在AJAX請求期間,我需要更新頂部,底部和主面板的HTML(左側標題應保持不變)。ASP.NET MVC和AJAX

我想知道什麼是最好的方法來實現這一點。第一個想法是將主內容面板放入局部區域,並具有可返回PartialView的控制器操作。這不起作用,因爲該操作僅返回主窗格的HTML,我無法更新頂部和底部標題。

因此,如果我把頂部和底部標題放入各自的部分視圖中,我需要我的控制器操作來返回多個部分視圖。這是可能的嗎?或者我正在做一些完全脫離軌道的事情?

我看到有可能render a partial view to a string所以我認爲我可以在動作中使用這種技術來返回一個JSON對象,其中有3個屬性代表我需要更新的3個部分的HTML。但如果可能的話,這對我來說就像是一個非常錯誤的方法。

我的另一個想法是返回一個JSON對象,只包含partials所需的數據,並使用javascript來構造HTML。但在javascript中構建UI看起來很困難(主要內容部分使用MvcContrib的GridView進行分頁和排序)。

所以我真的很感謝什麼是最乾淨的方法來處理這種情況的建議。另外一個適應性的解決方案將是很好的:例如,如果用戶有 JavaScript禁用它將只重新加載整個頁面沒有AJAX。


UPDATE:

Andrew Siemersuggested將每個部分到其自己的局部視圖,並執行多個AJAX請求。這似乎是一種完全有效的方法,但不幸的是它並不適用於我的情況,因爲我在最初的問題描述中錯過了以下詳細信息:頂部標題實際上用於顯示主面板中發生的事件的錯誤/信息消息。因此,例如,我需要顯示錯誤消息,以防在爲主面板提取模型時引發異常。因此,只有一個請求才能更新這兩個面板。

+0

你可能會對這看看:http://stackoverflow.com/questions/7086440/mvc-validating-binded- to-entitiy-with-reference-to-other-entities請(不知道如何直接與你聯繫):) thnx – cpoDesign 2011-08-17 20:29:12

回答

9

您可以輕鬆地將每個部分放入其自己的部分視圖中。這樣一旦您的數據被提交/更改,您就可以爲每個視圖創建一個jquery請求。每個電話都可以被推送到適當的部分。這是非常可行的,聽起來像適當的路徑。

我不希望你的控制器返回多個部分視圖...因爲這會打破SRP!

更新:在跟隨您的更新...您仍然可以單獨獲取這些部分。這僅僅需要更多的ajax冷靜,因爲每個提取都可以返回一個錯誤塊(通過JSON請求)。如果出現任何錯誤,那麼這些錯誤消息可以顯示在標題中。或者...一旦所有其他請求都報告回來,您可以使報頭請求最後一次發生錯誤,在這種情況下,每個局部視圖可以將錯誤消息拋出到錯誤狀態的會話變量中,然後將這些消息顯示在標題。

在最初的設計中,選擇每個部分作爲自己的部分而不是一個超級請求的主要原因可能還不明顯。隨着每個部分被分開控制,你可以做一些花哨的事情,比如獨立地緩存每個部分,在另一個區域提供更頻繁的更新等。

+0

感謝Andrew的提示。不幸的是,我錯過了我的初始描述中的一個重要細節,因此我擔心這個建議不能應用於我的場景中。我相應地更新了我的問題。 – 2009-07-08 06:43:37

0

這是一個棘手的問題。這個怎麼樣?

爲每個組件的top,left,main設置一個partial request,每個組件返回一個帶有該區域所需數據的局部視圖。然後每次在主面板中發生事件時,都會刷新每個區域中的部分以更新它們。

或者讓他們在固定計時器上輪詢新數據。

0

如何將主視圖中的頂部視圖和右側視圖包含在隱藏div中並將它們移動到正確的位置?

0

我知道這個問題已經回答了,但認爲我只是一個建議間距:

  • Backbone.js的和jQuery模板很容易解決您的問題。

(只是要離開這裏了這是一個建議,供人們閱讀這個問題)