2009-11-17 96 views
1

我試圖將兩部分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個可能的解決方案,但兩者都有缺點:

  1. 使用jQuery + 2控制器操作:1)發回成功/失敗消息,如果成功,客戶端代碼2)使用對Customers/List的Ajax調用並刷新#CustomerList。

    專業:直截了當。容易明白。可以重用已存在的客戶/列表控制器操作。

    Con:需要2次調用服務器。在這一點上,表現並不是一個問題,但過去,我曾在沒有考慮到電話數量的地方工作過,而且它逐漸陷入了一個問題,你不能輕易退出。

  2. 使用jQuery + 1控制器操作。返回包含1)成功/失敗和2)#CustomersList的刷新結果的JsonResult。

    專業:1服務電話。

    Con:複雜性。 #CustomersList最初是使用局部視圖和非常簡單的控制器方法創建的。返回一個Json結果,不太清楚CustomersList.ascx局部視圖如何適合圖片。

  3. 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回的能力。在這裏,我只是選擇發送一個通用的錯誤消息,但是在將來,我可能會使其更加健壯。

回答

1

JQuery ajax調用具有用於成功和失敗的函數處理程序。如果拋出包含失敗文本的異常,則可以使用一個服務器調用。結果會成功或失敗,調用到不同的處理函數中,每個處理函數都準確地知道在哪裏顯示結果以及如何從生成的JSON對象中獲取結果。

查看http://docs.jquery.com/Ajax/jQuery.ajax以查看jQuery的ajax()方法的成功和錯誤選項的說明。 (使用錯誤,就像成功。)

+0

我會看看。謝謝。 – John 2009-11-17 20:21:42

+0

它的工作原理。謝謝。 – John 2009-11-18 20:47:41

0

簡單 - 作爲POST/Response週期的一部分,傳入一個變量,告訴UI在哪裏更新東西,比如列表或DIV的ID。

相關問題