ABP文檔 - Javascript Api - AJAX

本節內容:

  • AJAX操作相關問題
  • ABP的方式
    • AJAX 返回信息
    • 處理錯誤
      • HTTP 狀態碼
    • WrapResult和DontWrapResult特性
      • Asp.net Mvc 控制器
      • Asp.net Web Api 控制器
      • 動態Web Api層
      • Asp.net Core 控制器
    • 動態Web Api層

?

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 idreturn 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。kid1412注(ABP版本為1.0-1.1):此處列出模板生成的登錄里含有的targetUrl的示例代碼,另外迷惑人的是:生成的Login.cshtml里包含登錄的Form,和“登錄”的submit按鈕,但它真正起作用的是Login.js里的點擊事件里ajax,代碼如下:
  •         [HttpPost][DisableAuditing]public async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "", string returnUrlHash = ""){CheckModelState();var loginResult = await GetLoginResultAsync(loginModel.UsernameOrEmailAddress,loginModel.Password,loginModel.TenancyName);await SignInAsync(loginResult.User, loginResult.Identity, loginModel.RememberMe);if (string.IsNullOrWhiteSpace(returnUrl)){returnUrl = Request.ApplicationPath;}if (!string.IsNullOrWhiteSpace(returnUrlHash)){returnUrl = returnUrl + returnUrlHash;}return Json(new AjaxResponse { TargetUrl = returnUrl});}
    View Code
    返回的結果會在abp.jquery.js里處理,并被重定向到targetUrl:
            handleTargetUrl: function (targetUrl) {if (!targetUrl) {location.href = abp.appPath;} else {location.href = targetUrl;}},
    View Code
  • 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 idreturn 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 控制器

ABP自動包裝JsonResult、ObjectResult和任何未實現IActionResult的結果,更多信息查看Asp.net Core 文檔。

你可以從啟動配置(使用Configuration.Modules.AbpAspNetCore()...)改變這種默認行為。

?

動態Web Api層

雖然ABP提供了一種簡單使用AJAX的機制,但在一個真實世界的應用里,為每個AJAX調用寫一個javascript函數還是很典型的,例如:

//Create a function to abstract AJAX call
var savePerson = function(person) {return abp.ajax({url: '/People/SavePerson',data: JSON.stringify(person)});
};//Create a new person
var newPerson = {name: 'Dougles Adams',age: 42
};//Save the person
savePerson(newPerson).done(function(data) {abp.notify.success('created new person with id = ' + data.personId);
});

為每個AJAX調用寫一個函數,這是一個好的實踐,但耗時且無趣, ABP可以自動地為應用服務和控制器生成這些類型的函數。

查閱動態Web Api層文檔獲取更多Web Api信息,查閱Asp.net Core文檔獲取有關Asp.net Core集成信息。

?

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視達配色教程17 灰色的色彩意象是什么

視達配色教程17 灰色的色彩意象是什么 一、總結 一句話總結&#xff1a;沒有個性的色彩 1、灰色的一般意象是什么&#xff1f; 所有混沌的情感不友好的色彩可怕、恐怖和殘忍感情貧乏或者內向年齡和年老遺忘的過去貧困與謙虛劣等的顏色秘密與非法合適的中等-男式時裝的標準 二、…

AngularJs 相應回車事件

最近做項目&#xff0c;要用到AngularJs&#xff0c;之前也有用過一點點&#xff0c;但僅限于數據的綁定&#xff0c;這次項目要整個前端需要使用這個框架&#xff0c;可能是不熟悉的原因&#xff0c;感覺這代碼搞起來非常的不便利&#xff0c;&#xff1b;現總結一個響應回車事…

android6流暢,Android應用流暢(Seamlessness)設計

即使你的應用程序是快速且響應靈敏的&#xff0c;但一些設計仍然會給用戶造成問題——與其它應用程序或對話框未事先計劃的交互&#xff0c;意外的數據丟失&#xff0c;意料之外的阻塞等 等。避免這些問題&#xff0c;有助于理解應用程序運行的上下文和系統的交互過程&#xff…

stack overflow--技術問答網站

轉自&#xff1a;http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一個與程序相關的IT技術問答網站。用戶可以在…

8782:乘積最大

【題目描述】 有一個長度為N的數字串&#xff0c;要求選手使用K個乘號將它分成K1個部分&#xff0c;找出一種分法&#xff0c;使得這K1個部分的乘積能夠為最大。 【題目鏈接】 http://noi.openjudge.cn/ch0206/8782/ 【算法】 決策過程&#xff1a;決策插入第i個乘號的位置使插…

uvalive 4973 Ardenia

題意&#xff1a;給出空間兩條線段&#xff0c;求距離。 注意輸出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…

rz和sz上傳下載文件

安裝軟件包 yum install lrzsz 上傳文件&#xff0c;輸入rz選擇文件上傳(可以按住shift鍵多選) # rz sz 下載文件到本地&#xff0c;選擇保存文件夾 # sz dd xshell設置默認上傳下載文件夾 轉載于:https://www.cnblogs.com/fcing/p/9382377.html

上班第一天(6)--一個程序員的成長史(15)

走出公司大門口之后&#xff0c;代是雄看到很多人都朝著一個方向走去。代是雄比較納悶&#xff0c;于是便問保安這是什么情況。“你是新來的吧&#xff1f;連這個都不知道嗎&#xff1f;”保安似乎不屑于回答新人的問題。“我是新來的實習生&#xff0c;”代是雄壓制住了心中的…

自學Java匯報(3)

本周自學Java總結&#xff1a; 繼承語法、成員變量的隱藏和方法的覆蓋、super、final、多態、組合于繼承、初始化順序、部分抽象類。 總用時八小時&#xff0c;編程兩小時。 下周目標&#xff1a;接口、枚舉、異常。轉載于:https://www.cnblogs.com/lianghang/p/9384793.html

怎樣在html中設置首字母大寫,javascript如何設置字符串首字母大寫?

給出一個字符串&#xff0c;如何確保字符串的首字母都大寫&#xff1f;下面本篇文章就來給大家介紹一下使用javascript設置首字母大寫的方法&#xff0c;希望對大家有所幫助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法來設置首字母…

win2008修改遠程端口

2019獨角獸企業重金招聘Python工程師標準>>> 網絡上找到的一段代碼&#xff0c;保存為.bat&#xff0c;運行修改成功&#xff0c;需要重啟。 echo off color 0a echo ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ echo ◇◇◇◇修改遠程桌面3389端口批處理◇◇◇◇ ech…

ios7 蘋果原生二維碼掃描(和微信類似)

在ios7蘋果推出了二維碼掃描&#xff0c;以前想要做二維碼掃描&#xff0c;只能通過第三方ZBar與ZXing。 ZBar在掃描的靈敏度上&#xff0c;和內存的使用上相對于ZXing上都是較優的&#xff0c;但是對于 “圓角二維碼” 的掃描確很困難。 ZXing 是 Google Code上的一個開源的條…

有符號位和無符號位。——int8疑問有感

學習go語言的數據類型&#xff0c;看見int、int8、int16很是疑惑&#xff0c;int8是什么意思&#xff1f;查詢資料進行綜合解釋大概如下&#xff1a; Int8是有符號位8位整形&#xff08;-128到127&#xff09;&#xff0c;隨即產生疑惑&#xff0c;為什么負數可表示到-128&…

html幫助文檔亂碼,使用doxygen生成的幫助文檔,中文出現亂碼的問題

今天使用doxygen工具生成幫助文檔發現中文注釋都是亂碼。然后根據網上的要求把Exper>>Input>>INPUT_ENCODING&#xff1a;(輸入文件的編碼) UTF-8 改成 GBK 或者 GB2312Exper>>HTML>>CHM_INDEX_ENCODING&#xff1a;(輸出文件的編碼) UTF-8 改成 GBK 或…

Java并發編程--理解ThreadLocal

另一篇博文&#xff1a;Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文參考&#xff1a;http://blog.csdn.net/lufeng20/article/details/24314381http://www.cnblogs.com/chenying99/articles/3405161.html ThreadLocal類接口很簡單&#xf…

delphi Post數據到網頁

varhttp: TIdHttp;sendtoserver: TStringStream;str: string; beginhttp : TIdHttp.Create(); // 創建http.HandleRedirects : True; // 允許轉頭http.ReadTimeout : 3000; …

python之路——迭代器與生成器

要了解for循環是怎么回事兒&#xff0c;咱們還是要從代碼的角度出發。 首先&#xff0c;我們對一個列表進行for循環。 for i in [1,2,3,4]: print(i) 上面這段代碼肯定是沒有問題的&#xff0c;但是我們換一種情況&#xff0c;來循環一個數字1234試試 for i in 1234print(i) 結…

HTML頁面顯示透視效果,html – CSS – 對背景圖像的“敲除”/透視效果

我認為這里的想法是圖像必須足夠大,以覆蓋網頁或至少父母div ..然后,您可以將圖像應用于容器和’inner’div的背景.覆蓋可以通過偽元素而不是單獨的div來實現.修訂結構 –.bck {position: relative;height: 800px;width: 100%;background:url(http://webneel.com/wallpaper/sit…

DFS分布式文件系統--管理篇

DFS分布式文件系統--管理篇參考文檔&#xff1a;淺談DFS分布式文件系統DFS 命名空間 和 DFS 復制概述續DFS分布式文件系統--基礎篇DFS分布式文件系統--部署篇添加命名空間服務器&#xff08;添加第二臺命名空間服務器 NameSrv02)成功后如下圖&#xff1a;“從顯示區域隱藏命名空…

Linux 0-1 修改主機名及IP地址

1.修改主機名 hostname 查看主機名 vi /etc/sysconfig/network 修改hostname主機名 vi /etc/hosts 修改127.0.1 主機名 service network restart #/etc/hosts 在域名解析時優先于DNS服務器2.IP地址 ifconfig 查看目前網絡卡信息 cd /etc/sysconfig/network-scripts ls查看…