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.mzph.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查看…