我試圖將兩部分MVC組合在一起:1)Ajax和2)錯誤處理。問題在於返回的內容以及它返回的位置(要更新的div元素)。在ASP.Net MVC中,從對話框執行更新的最佳方法是什麼?
我有一個ASP.net MVC頁面看起來像下面
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Store>" %>
<div id="MainPage>
<div id="Some Stuff>
Lorem Ipsum
</div>
<div id="CustomerList>
<% Html.RenderPartial("~/Views/Customers/List.ascx", Model.Customers); %>
</div>
<div id="dialog">
<div id="dialogErrorMessage"></div>
</div>
</div>
的客戶列表局部視圖將與客戶的名單表。每個記錄將有一個編輯鏈接,這將打開一個對話框,從客戶/ Edit.ascx局部視圖的信息來填充它,它看起來像:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Customer>" %>
<fieldset>
<p>
<label for="CustomerName"></label>: <%= Html.TextBox("CustomerName", Model.CustomerName)) %>
</p>
<p>
<label for="CustomerAddress"></label>: <%= Html.TextBox("CustomerAddress", Model.CustomerAddress)) %>
</p>
<p>
<input id="btnSave" type="submit" value="Save" />
</p>
</fieldset>
當點擊btnSave,它會做一個帖子客戶/編輯。如果更新成功,則該對話框應關閉,並且應刷新#CustomersList。 但是,如果更新失敗,#dialog應該保持打開狀態,並且#dialogErrorMessage應該顯示「更新失敗,錯誤是等等等等......」。
這裏是我卡住的地方。 ASP.Net MVC Ajax幫助器方法和jQuery庫都可以做一個Ajax帖子並輕鬆地替換一個div,但是在大多數例子中,客戶端知道哪個div要在之前替換,它會調用Ajax。在我的錯誤處理示例中,客戶端不知道要更新哪個div,直到後它獲悉更新成功。我想出了2個可能的解決方案,但兩者都有缺點:
- 使用jQuery + 2控制器操作:1)發回成功/失敗消息,如果成功,客戶端代碼2)使用對Customers/List的Ajax調用並刷新#CustomerList。
專業:直截了當。容易明白。可以重用已存在的客戶/列表控制器操作。
Con:需要2次調用服務器。在這一點上,表現並不是一個問題,但過去,我曾在沒有考慮到電話數量的地方工作過,而且它逐漸陷入了一個問題,你不能輕易退出。
- 使用jQuery + 1控制器操作。返回包含1)成功/失敗和2)#CustomersList的刷新結果的JsonResult。
專業:1服務電話。
Con:複雜性。 #CustomersList最初是使用局部視圖和非常簡單的控制器方法創建的。返回一個Json結果,不太清楚CustomersList.ascx局部視圖如何適合圖片。
- ASP.Net MVC Ajax幫助程序方法 - 我看不出這提供了一個解決方案,因爲它的主要方法是使用UpdateTargetID更新目標。
我還是比較新的jQuery和嚴肅的Ajax編程。我知道這兩種方式都可以工作,但我想知道「爲什麼」一個選擇比其他選擇更好。從很多痛苦的Javascript編程中,我從Douglas Crockford和其他人那裏瞭解到,Javascript中的編程模式與服務器端C#,Java等不同。
什麼是最佳方式?
解決方案
在John的推薦下,我也考慮內置到jQuery的$就錯誤的功能,但仍有另一塊我失蹤:
在控制器中,我需要把
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
}
最初,我選擇只拋出異常。這迫使錯誤運行,但我真正想要的是來自服務器的自定義消息,而不是ASP.Net異常。
通過增加線Response.StatusCode = 500,它會導致jQuery的理解有錯誤發生,但它也爲我提供了更好地定義什麼得到sents回的能力。在這裏,我只是選擇發送一個通用的錯誤消息,但是在將來,我可能會使其更加健壯。
我會看看。謝謝。 – John 2009-11-17 20:21:42
它的工作原理。謝謝。 – John 2009-11-18 20:47:41