ABP文档 - Javascript Api - 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:
}; 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 = });
}
}
SavePersonModel包含Name和Age属性,SavePerson标记为HttpPost,因此abp.ajax的默认方法为POST。我简化方法的实现,只返回一个匿名对象。
这样直截了当,但有些重要的东西ABP在背后进行了处理,让我们深入细节...
AJAX 返回信息
即使我们返回一个PersonId=2对象,ABP把它包装成一个MvcAjaxResponse对象,AJAX响应实质上像下面这样:
{
"success": true,
"result": {
"personId":
},
"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});
}返回的结果会在abp.jquery.js里处理,并被重定向到targetUrl:
handleTargetUrl: function (targetUrl) {
if (!targetUrl) {
location.href = abp.appPath;
} else {
location.href = targetUrl;
}
},- 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 = });
}
}
作为快捷方式,我们可以仅使用[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:
}; //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
ABP文档 - Javascript Api - AJAX的更多相关文章
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
- ABP文档 - Javascript Api - Message
本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...
- ABP文档 - Web Api 控制器
文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web. ...
- 利用未文档化API:RtlGetNtVersionNumbers 获取系统版本号
问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...
- 在线文档转换API word,excel,ppt等在线文件转pdf、png
在线文档转换API提供word,excel,ppt等在线文件转pdf.png等,文档:https://www.juhe.cn/docs/api/id/259 接口地址:http://v.juhe.cn ...
- ABP文档笔记系列
ABP文档笔记 - 模块系统 及 配置中心 ABP文档笔记 - 事件BUS ABP文档笔记 - 数据过滤 ABP文档笔记 - 规约 ABP文档笔记 - 配置.设置.版本.功能.权限 ABP文档笔记 - ...
- ABP文档 :Overall - Introduction
介绍 我们基于不同的需求创建不同的应用,但却在一次又一次地实现相同或相似的结构.至少在某种程度上,授权.验证.异常处理.日志.本地化.数据库连接管理.配置管理.审计日志属于通用的结构. 另外我们总是在 ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- ABP文档 - 导航
文档目录 本节内容: 创建菜单 注册导航供应器 显示菜单 每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户. 创建菜单 一个应用可能由不同模块组成 ...
随机推荐
- 微信公众号开发之VS远程调试
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...
- ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...
- 基于AOP的MVC拦截异常让代码更优美
与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...
- 品牌营销:不要Beat,要逼格!
品牌营销:不要Beat,要逼格! 奥美的创始人大卫·奥格威说,广告营销应当是"具有风度的推销产品".而当下的营销手段,"风度"早已被抛之脑后, ...
- BPM助力企业数字化转型
自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...
- Android—应用程序开机自启
android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...
- gulp 自动添加版本号
本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理 npm官网介绍使用后的效果如下: "/css/style.css" => " ...
- 在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...
- linux中kvm的安装及快照管理
一.kvm的安装及状态查看 1.安装软件 yum -y install kvm virt-manager libvirt2.启动libvirtd 报错,升级device-mapper-libs yum ...
- Nlog配置实例
彩色Console target <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns= ...