ABP官方文档(三十八)【AJAX API】
6.6 ABP表现层 - AJAX API6.6.2.1 AJAX操作问题现代的应用经常会使用AJAX,尤其是单页应用,几乎是和服务器通信的唯一手段,执行AJAX通常会有以下步骤:
6.6.2.2 ABP的方式由于使用 abp.ajax 函数对AJAX调用进行了封装, 所以ABP能自动化这些步骤。下面是一个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得到 options 作为对象。你可以传递任何有效的jQuery的 $.ajax 函数中的参数。有一些默认参数:dataType 是 json,type是 POST,还有 contentType是 application/json(在发送数据到服务器端之前,我们需要调用 JSON.stringify 将脚本对象转换为JSON字符串)。通过对apb.ajax传递options可以覆盖默认值。 abp.ajax返回promise。因此,你可以写这些处理函数:done,fail,then等等。在这个例子中,我们对 PeopleController’s SavePerson action 发送了一个简单的AJAX请求。在 done 处理函数中,我们对新创建的person取得了它的主键id并且显示了创建成功的通知。让我们看看 MVC Controller: public class PeopleController : AbpController
{
[HttpPost]
public JsonResult SavePerson(SavePersonModel person)
{
//TODO: 保存新创建的person到数据库并且返回person的id
return Json(new {PersonId = 42});
}
}
正如你猜测的 SavePersonModel 包含了Name和Age属性。SavePerson 被标记为 HttpPost 特性,因为abp.ajax默认方法是POST。通过返回了匿名对象简化了方法实现。 这个看上去很简单直白,但是ABP在背后做了很多重要的处理。让我们深入了解一下: 6.6.2.3 AJAX 返回消息即使我们直接的返回了一个带有PersonId = 2 的对象,ABP也会使用 MvcAjaxResponse 对象来包装它。事实上AJAX响应返回的内容应该像下面一样: {
"success": true,"result": { "personId": 42 },"error": null,"targetUrl": null,"unAuthorizedRequest": false,"__abp": true }
在这里所有的属性都是驼峰命名的(因为这在JavaScript中是惯例),即使在服务端代码中是PascalCased的。下面解释一下所有的字段:
这种格式的对象会被 abp.ajax 函数识别且处理。abp.ajax会得到控制器的实际返回值(一个带有personid属性的对象),如果没有错误的话,那么你会在done函数中处理返回值。 6.6.2.4 处理错误正如上面所述,ABP在服务器端处理异常,并且返回一个带有错误消息的对象。如下所示: {
"targetUrl": null,"result": null,"success": false,"error": { "message": "An internal error occured during your request!","details": "..." },"__abp": true }
正如你看到的,success是false 并且 result是null。abp.ajax处理这个对象,并且使用abp.message.error函数来显示错误消息给用户。如果你的服务器端代码抛出了 UserFriendlyException 类型的异常。它会直接的显示异常信息给用户。否则,它会隐藏实际的错误(将错误写入日志),并且显示一个标准的“服务器内部错误…”信息给用户。所有的这些都是ABP自动处理的。 你可能想为某个特别的AJAX调用禁止显示消息,那么添加 * abpHandleError: false* 到 abp.ajax的options。 HTTP状态码在异常发生的时候,ABP会返回给定的HTTP状态码:
6.6.2.5 WrapResult和DontWrapResult特性使用 WrapResult和DontWrapResult 特性,可以对控制器的某个action或者所有的action来控制包装。 ASP.NET MVC 控制器如果返回的类型是 JsonResult(或者Task public class PeopleController : AbpController
{
[HttpPost]
[WrapResult(WrapOnSuccess = false,WrapOnError = false)]
public JsonResult SavePerson(SavePersonModel person)
{
//TODO: 保存新创建的person到数据库并且返回person的id
return Json(new {PersonId = 42});
}
}
作为一个快速开发方式,我们只能使用 [DontWrapResult] 特性在这个相同的示例上。 你可以在启动配置里面改变这个默认的行为(使用 Configuration.Modules.AbpMvc()…)。 ASP.NET Web API 控制器如果action被成功执行,ABP 不会默认包装 Web API Action的返回结果。如果需要的话,你可以添加WrapResult特性到action或者控制器上。但是它会 包装异常。 你可以在启动配置里面改变这个默认的行为(使用 Configuration.Modules.AbpWebApi()…)。 动态Web API层默认 ABP会 包装 动态Web API层的所有方法。你可以在你应用服务的接口上使用 WrapResult和DontWrapResult 特性来改变这个行为。 你可以在启动配置里面改变这个默认的行为(使用 Configuration.Modules.AbpWebApi()…)。 ASP.NET Core 控制器ABP会自动包装JsonResult,ObjectRes以及那些没有实现IActionResult对象。详情请查阅ASP.NET Core文档。 你可以在启动配置里面改变这个默认的行为(使用 using Configuration.Modules.AbpAspNetCore()…)。 6.6.2.6 动态Web API层虽然ABP提供了一种调用Ajax的简单机制,但是在真实世界的应用中,为每个Ajax调用编写javascript函数是很经典的。例如: //创建一个抽象了Ajax调用的function
var savePerson = function(person) {
return abp.ajax({
url: '/People/SavePerson',data: JSON.stringify(person)
});
};
//创建一个新的 person
var newPerson = {
name: 'Dougles Adams',age: 42
};
//保存该person
savePerson(newPerson).done(function(data) {
abp.notify.success('created new person with id = ' + data.personId);
});
这是一个最佳实践,但是对每个AJAX调用函数都这样做,那是耗时且乏味的。对于应用服务和控制器,ABP能够自动的生成这些函数。 详情请阅读动态Web API层文档和ASP.NET Core文档。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |