<<ABP文檔>> Javascript Api - AJAX

來源:互聯網
上載者:User

標籤:page   字元   with   javascrip   包含   friend   database   客戶   布爾   

本節內容:

  • AJAX操作相關問題
  • 確認

 

AJAX操作相關問題

執行一個AJAX調用在現在的應用裡非常常見,尤其在SPAs(Single-Page Applications 單頁面應用)裡,它幾乎是唯一與伺服器通訊的方式。一個AJAX調用由幾個重複的步驟組成:

在用戶端,基本上,javascript代碼應該提供一個URL,隨意的一個資料和選擇一個方法(POST,GET...)來執行一個AJAX調用,它必須等待並處理傳回值,當向伺服器執行一個調用時,可能會出錯(通常網路錯誤),或其它服務端錯誤,服務端返回一個攜帶錯誤資訊的失敗的響應,用戶端應該處理這些或通知使用者(可顯示一個錯誤對話方塊),如果沒有錯誤,服務端發送一個返回資料,用戶端也必須處理它。操作過程中,通常會屏蔽或整個螢幕並顯示一個AJAX正在操作的資訊,直到它完成。

服務端代碼擷取到一個請求,執行一些服務端代碼,捕獲任何的異常並返回一個有效返回給用戶端。如果有出錯的情況,可能會發送錯誤資訊給用戶端,如果是一個驗證錯誤,伺服器可能會添加一個驗證問題。如果成功,可能會發送一個傳回值給用戶端。

 

ABP的方式

ABP使用通過封裝了AJAX調用的abp.ajax,自動處理這些步驟,下面是一個AJAX調用樣本:

var newPerson = {    name: ‘Dougles Adams‘,    age: 42};abp.ajax({    url: ‘/People/SavePerson‘,    data: JSON.stringify(newPerson)}).done(function(data) {    abp.notify.success(‘created new person with id = ‘ + data.personId);});

abp.ajax擷取一個可選的對象,你可以傳遞任何的參數(它會被jQuery的$.ajax方式驗證),此處有些預設:dataType:‘json‘,type:‘POST‘,contentType:‘application/json‘(所以,在發送到伺服器前,我們調用JSON.stringify把javascript轉換為JSON字串),我們可以給abp.ajax傳遞options來覆蓋這些預設.

abp.ajax返回promise,所以,你可以寫done,fail,then....處理常式,在這個例子中,我們建立了一個簡單的AJAX請求,調用PeopleController的SavePerson操作,在done處理常式裡,我們擷取資料庫裡新建立的person的id並顯示一個成功的通知(查看notification API)。我們看一下這個AJAX調用的MVC控制器:

public class PeopleController : AbpController{    [HttpPost]    public JsonResult SavePerson(SavePersonModel person)    {        //TODO: save new person to database and return new person‘s id        return Json(new {PersonId = 42});    }}

 

SavePersonModel包含Name和Age屬性,SavePerson標記為HttpPost,因此abp.ajax的預設方法為POST。我簡化方法的實現,只返回一個匿名對象。

這樣直截了當,但有些重要的東西ABP在背後進行了處理,讓我們深入細節...

 

AJAX返回資訊

即使我們返回一個PersonId=2對象,ABP把它封裝成一個MvcAjaxResponse對象,AJAX響應實質上像下面這樣:

{  "success": true,  "result": {    "personId": 42  },  "error": null,  "targetUrl": null,  "unAuthorizedRequest": false,  "__abp": true}

 

此處,所有屬性都是小駱峰式命名(因為這是javascript世界裡約定好的),即使它們在服務端是大駱峰式命名。讓我們解釋一下這些屬性:

  • success:一個布爾值(true或false),指示操作的是否成功,如果為true,abp.ajax解板promise並調用done處理常式,如果為false(如果有方法調用中拋出異常),它調用fail處理常式,並使用abp.message.error函數顯示error資訊。
  • result:返回控制器裡操作的結果,如果success為true時伺服器發送一個傳回值後,它才可用。
  • error:如果success為false,這個屬性包含一個錯誤明細資訊的對象。
  • targetUrl:提供一個URL給服務端,在有需要的時候,把用戶端定向到這個URL。
  • unAuthorizedRequest:服務端給用戶端一個通知:這個操作未被認證或使用者未被認證。如果為true,abp.ajax重新載入當前頁面。
  • _abp:一個特殊的標誌,表示響應是ABP封裝的,你不需要使用它,abp.ajax會處理它。

abp.ajax函數識別和處理這個返回格式,如果不出錯,abp.ajax裡你的done處理常式擷取真正的控制器的傳回值(一個包含personId屬性的對象)。 

 

處理錯誤

如上所述,ABP在伺服器處理異常並返回一個包含錯誤資訊的對象:

{  "targetUrl": null,  "result": null,  "success": false,  "error": {    "message": "An internal error occured during your request!",    "details": "..."  },  "unAuthorizedRequest": false,  "__abp": true}

 

如你所見,success為false且result為null,abp.ajax處理這個對象且通過abp.message.error函數顯示一個錯誤資訊給使用者。如果服務端拋出一個userFriendlyException類型的異常,它直接給使用者顯示錯誤資訊,否則,它隱藏實際錯誤(把錯誤寫到日誌)並顯示一個“發生一個內部錯誤..."資訊給使用者,這些ABP都會自動處理。

你可能會想為某些特定的AJAX調用,禁止顯示資訊,此時你可以把abpHandleError:false添加到abp.ajax的options裡。

 

HTTP狀態代碼

ABP為異常返回給定的狀態代碼:

  • 401為未認證的請求(使用者未登入,但服務端操作需要認證)。
  • 403為未授權的請求。
  • 500為所有其它類型的異常。

 

WrapResult和DontWrapResult特性

你可以通過為一個操作或控制器的所有操作使用WrapResult和DontWrapResult特性來控制封裝。

 

Asp.net Mvc 控制器

如果Asp.net Mvc 操作方法傳回型別為JsonResult(或非同步Task<JsonResult>),ABP預設地會進行封裝(如上所述),你可以使用WrapResult特性改變這種行為,如下所示:

public class PeopleController : AbpController{    [HttpPost]    [WrapResult(WrapOnSuccess = false, WrapOnError = false)]    public JsonResult SavePerson(SavePersonModel person)    {        //TODO: save new person to database and return new person‘s id        return Json(new {PersonId = 42});    }}

 

作為捷徑,我們可以僅使用[DontWrapResult]來達到與此例相同目的。

你可以從啟動配置(使用Configuration.Modules.AbpMvc()...)改變這種預設行為。

 

Asp.net Web Api 控制器

ABP預設情況下不封裝成功的Web Api操作的結果,如果有需要,你可以添加WrapResult到操作或控制器上,但是預設封裝異常。

你可以從啟動配置(使用Configuration.Modules.AbpWebApi()...)改變這種預設行為。

 

動態Web Api層

ABP預設情況下封裝動態Web Api層的方法結果,你可以通過在你的應用服務介面上使用WrapResult和DontWrapResult特性來改這種行為。

 

Asp.net Core 

 

 

 

 

 

 

 

 

 

 

 

 

 


kid1412附:英文原文:http://www.aspnetboilerplate.com/Pages/Documents/Javascript-API/Message

<<ABP文檔>> Javascript Api - AJAX

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.