<<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: 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

时间: 2024-12-09 21:35:23

<<ABP文档>> Javascript Api - AJAX的相关文章

&lt;&lt;ABP文档&gt;&gt; Javascript Api

文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions ABP提供了一序列的对象和功能,使javascript开发容易且标准. 此处有一个ABP里api的列表,点击标题查看明细和使用方法. AJAX 使用AJAX调用服务端服务并计算返回值,因为ABP服务端代码返回一个标准的响应给AJAX调用,所以建议使用这个方法处理标准的返回值. Notification 显示自

&lt;&lt;ABP文档&gt;&gt; Javascript Api - Message

本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包含它的css和javascript文件,然后把abp.sweet-alert.js适配器包含到你的页面里. 显示信息 例如: abp.message.info('some info message', 'some optional title'); abp.message.success('some

&lt;&lt;ABP文档&gt;&gt; Web Api 控制器

文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web.Api的nuget包,把ABP集成到Asp.net Web Api 控制器里.你可以像之前做的一样创建平常的Asp.net Web Api控制器,依赖注入会很好地为这些平常的ApiController工作,但你要把你的控制器继承于AbpApiController,它提供了许多好处和更好地集成到ABP

&lt;&lt;ABP文档&gt;&gt; 异常处理

文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个方法针对Asp.net Mvc和Web Api,如果你对Asp.net Core感兴趣,请看Asp.net Core文档. 在一个Web应用里,异常通常在Mvc控制器的Action或Web Api 控制器的Action里被处理,当一个异常姓时,应用的用户会通过某种方式收到错误信息和错误的可能原因. 如果一个错误发生在平常的HTTP请

&lt;&lt;ABP文档&gt;&gt; 通知系统

文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发生了,ABP提供一个发布/订阅,它基于实时通知基础框架. 发送模式 有两种方式可以发送通知给用户: 用户订阅一个特定的通知类型,然后我们发布一个此类型的通知,它会分发给所有订阅的用户,这就是发布/订阅模式. 我们可以直接发送一个通知给目标用户(users). 通知类型 有两种通知类型: 一般通知:任

&lt;&lt;ABP文档&gt;&gt; Mvc 控制器

文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mvc集成到Asp.net Mvc 控制器.你可以像往常那样创建普通的Mvc控制器,依赖注入可以对普通的Mvc控制器起作用,但你应当使你的控制继承自AbpController,它提供了许多好处和更好的集成到ABP. AbpController基类 这是一个简单的继承自AbpController的控制器:

&lt;&lt;ABP文档&gt;&gt; 导航

文档目录 本节内容: 创建菜单 注册导航供应器 显示菜单 每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户. 创建菜单 一个应用可能由不同模块组成,每个模块可以有它自己的菜单项,为了定义菜单项,我们需要创建一个继承于NavigationProvider的类. 假设有一个如下所示的主菜单: Tasks Reports Administration User management Role management 这里,Administration

ABP文档 - 对象与对象之间的映射

文档目录 本节内容: 简介 IObjectMapper 接口 集成 AutoMapper 安装 创建映射 自动映射的特性 自定义映射 扩展方法 MapTo 单元测试 预定义的映射 LocalizableString -> string 注入 IMapper 简介 把一个对象映射到另一个相似的对象很常见,两个对象(类)具有相似或相同的属性,它们之间要互相映射,其实这项工作重复且无聊,考虑一个典型的应用服务方法,如下: public class UserAppService : Applicatio

&lt;&lt;ABP文档&gt;&gt; 嵌入的资源文件

文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的文件,有时,我们需要把一些这样的文件打包入一个程序集(一个类库项目,一个Dll文件),并且作为嵌入式资源文件部署在这个程序集里,ABP提供了一个基础架构,方便地处理这件事. 创建嵌入的文件 我们首先要创建一个资源文件并把它标记为嵌入式资源,任何程序集都可以包含嵌入式资源文件,假设我们有一个名为“Ab