abp.jquery - 复制.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. var abp = abp || {};
  2. (function ($) {
  3. if (!$) {
  4. return;
  5. }
  6. /* JQUERY ENHANCEMENTS ***************************************************/
  7. // abp.ajax -> uses $.ajax ------------------------------------------------
  8. abp.ajax = function (userOptions) {
  9. userOptions = userOptions || {};
  10. var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
  11. var oldBeforeSendOption = options.beforeSend;
  12. options.beforeSend = function(xhr) {
  13. abp.ajax.blockUI(options);
  14. if (oldBeforeSendOption) {
  15. oldBeforeSendOption(xhr);
  16. }
  17. xhr.setRequestHeader("Pragma", "no-cache");
  18. xhr.setRequestHeader("Cache-Control", "no-cache");
  19. xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
  20. };
  21. options.success = undefined;
  22. options.error = undefined;
  23. return $.Deferred(function ($dfd) {
  24. $.ajax(options)
  25. .done(function (data, textStatus, jqXHR) {
  26. abp.ajax.unblockUI(options);
  27. if (data.__abp) {
  28. abp.ajax.handleResponse(data, userOptions, $dfd, jqXHR);
  29. } else {
  30. $dfd.resolve(data);
  31. userOptions.success && userOptions.success(data);
  32. }
  33. }).fail(function (jqXHR) {
  34. abp.ajax.unblockUI(options);
  35. if (jqXHR.responseJSON && jqXHR.responseJSON.__abp) {
  36. abp.ajax.handleResponse(jqXHR.responseJSON, userOptions, $dfd, jqXHR);
  37. } else {
  38. abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
  39. }
  40. });
  41. });
  42. };
  43. $.extend(abp.ajax, {
  44. defaultOpts: {
  45. dataType: 'json',
  46. type: 'POST',
  47. contentType: 'application/json',
  48. headers: {
  49. 'X-Requested-With': 'XMLHttpRequest'
  50. }
  51. },
  52. defaultError: {
  53. message: 'An error has occurred!',
  54. details: 'Error detail not sent by server.'
  55. },
  56. defaultError401: {
  57. message: 'You are not authenticated!',
  58. details: 'You should be authenticated (sign in) in order to perform this operation.'
  59. },
  60. defaultError403: {
  61. message: 'You are not authorized!',
  62. details: 'You are not allowed to perform this operation.'
  63. },
  64. defaultError404: {
  65. message: 'Resource not found!',
  66. details: 'The resource requested could not found on the server.'
  67. },
  68. logError: function (error) {
  69. abp.log.error(error);
  70. },
  71. showError: function (error) {
  72. if (error.details) {
  73. return abp.message.error(error.details, error.message);
  74. } else {
  75. return abp.message.error(error.message || abp.ajax.defaultError.message);
  76. }
  77. },
  78. handleTargetUrl: function (targetUrl) {
  79. if (!targetUrl) {
  80. location.href = abp.appPath;
  81. } else {
  82. location.href = targetUrl;
  83. }
  84. },
  85. handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
  86. if (userOptions.abpHandleError !== false) {
  87. switch (jqXHR.status) {
  88. case 401:
  89. abp.ajax.handleUnAuthorizedRequest(
  90. abp.ajax.showError(abp.ajax.defaultError401),
  91. abp.appPath
  92. );
  93. break;
  94. case 403:
  95. abp.ajax.showError(abp.ajax.defaultError403);
  96. break;
  97. case 404:
  98. abp.ajax.showError(abp.ajax.defaultError404);
  99. break;
  100. default:
  101. abp.ajax.showError(abp.ajax.defaultError);
  102. break;
  103. }
  104. }
  105. $dfd.reject.apply(this, arguments);
  106. userOptions.error && userOptions.error.apply(this, arguments);
  107. },
  108. handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
  109. if (messagePromise) {
  110. messagePromise.done(function () {
  111. abp.ajax.handleTargetUrl(targetUrl);
  112. });
  113. } else {
  114. abp.ajax.handleTargetUrl(targetUrl);
  115. }
  116. },
  117. handleResponse: function (data, userOptions, $dfd, jqXHR) {
  118. if (data) {
  119. if (data.success === true) {
  120. $dfd && $dfd.resolve(data.result, data, jqXHR);
  121. userOptions.success && userOptions.success(data.result, data, jqXHR);
  122. if (data.targetUrl) {
  123. abp.ajax.handleTargetUrl(data.targetUrl);
  124. }
  125. } else if (data.success === false || data.Success===false) {
  126. var messagePromise = null;
  127. if (!data.error && data.Error) {
  128. data.error = lowerJsonKey(data.Error);
  129. }
  130. if (data.error) {
  131. if (userOptions.abpHandleError !== false) {
  132. messagePromise = abp.ajax.showError(data.error);
  133. }
  134. } else {
  135. data.error = abp.ajax.defaultError;
  136. }
  137. abp.ajax.logError(data.error);
  138. $dfd && $dfd.reject(data.error, jqXHR);
  139. userOptions.error && userOptions.error(data.error, jqXHR);
  140. if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
  141. abp.ajax.handleUnAuthorizedRequest(messagePromise, data.targetUrl);
  142. }
  143. } else { //not wrapped result
  144. $dfd && $dfd.resolve(data, null, jqXHR);
  145. userOptions.success && userOptions.success(data, null, jqXHR);
  146. }
  147. } else { //no data sent to back
  148. $dfd && $dfd.resolve(jqXHR);
  149. userOptions.success && userOptions.success(jqXHR);
  150. }
  151. },
  152. blockUI: function (options) {
  153. if (options.blockUI) {
  154. if (options.blockUI === true) { //block whole page
  155. abp.ui.setBusy();
  156. } else { //block an element
  157. abp.ui.setBusy(options.blockUI);
  158. }
  159. }
  160. },
  161. unblockUI: function (options) {
  162. if (options.blockUI) {
  163. if (options.blockUI === true) { //unblock whole page
  164. abp.ui.clearBusy();
  165. } else { //unblock an element
  166. abp.ui.clearBusy(options.blockUI);
  167. }
  168. }
  169. },
  170. ajaxSendHandler: function (event, request, settings) {
  171. var token = abp.security.antiForgery.getToken();
  172. if (!token) {
  173. return;
  174. }
  175. if (!abp.security.antiForgery.shouldSendToken(settings)) {
  176. return;
  177. }
  178. if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
  179. request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
  180. }
  181. },
  182. lowerJsonKey:function (jsonObj) {
  183. if(jsonObj=== undefined || jsonObj === null) {
  184. return [];
  185. }
  186. if (jsonObj.length !== undefined) {
  187. for (var i = 0; i < jsonObj.length; i++) {
  188. lowerJsonKeyChild(jsonObj[i]);
  189. }
  190. } else {
  191. lowerJsonKeyChild(jsonObj);
  192. }
  193. return jsonObj;
  194. },
  195. lowerJsonKeyChild :function (jsonObj) {
  196. for (var k in jsonObj) {
  197. if (jsonObj.hasOwnProperty(k)) {
  198. var obj = jsonObj[k];
  199. if (typeof (obj) === "object" && (Object.prototype.toString.call(obj).toLowerCase() === "[object object]" || Object.prototype.toString.call(obj).toLowerCase() === '[object array]')) {
  200. jsonObj[k.substring(0, 1).toLowerCase() + k.substring(1)] = lowerJsonKey(obj);
  201. delete (jsonObj[k]);
  202. } else {
  203. jsonObj[k.substring(0, 1).toLowerCase() + k.substring(1)] = jsonObj[k];
  204. delete (jsonObj[k]);
  205. }
  206. }
  207. }
  208. return jsonObj;
  209. }
  210. });
  211. $(document).ajaxSend(function (event, request, settings) {
  212. return abp.ajax.ajaxSendHandler(event, request, settings);
  213. });
  214. /* JQUERY PLUGIN ENHANCEMENTS ********************************************/
  215. /* jQuery Form Plugin
  216. * http://www.malsup.com/jquery/form/
  217. */
  218. // abpAjaxForm -> uses ajaxForm ------------------------------------------
  219. if ($.fn.ajaxForm) {
  220. $.fn.abpAjaxForm = function (userOptions) {
  221. userOptions = userOptions || {};
  222. var options = $.extend({}, $.fn.abpAjaxForm.defaults, userOptions);
  223. options.beforeSubmit = function () {
  224. abp.ajax.blockUI(options);
  225. userOptions.beforeSubmit && userOptions.beforeSubmit.apply(this, arguments);
  226. };
  227. options.success = function (data) {
  228. abp.ajax.handleResponse(data, userOptions);
  229. };
  230. //TODO: Error?
  231. options.complete = function () {
  232. abp.ajax.unblockUI(options);
  233. userOptions.complete && userOptions.complete.apply(this, arguments);
  234. };
  235. return this.ajaxForm(options);
  236. };
  237. $.fn.abpAjaxForm.defaults = {
  238. method: 'POST'
  239. };
  240. }
  241. abp.event.on('abp.dynamicScriptsInitialized', function () {
  242. abp.ajax.defaultError.message = abp.localization.abpWeb('DefaultError');
  243. abp.ajax.defaultError.details = abp.localization.abpWeb('DefaultErrorDetail');
  244. abp.ajax.defaultError401.message = abp.localization.abpWeb('DefaultError401');
  245. abp.ajax.defaultError401.details = abp.localization.abpWeb('DefaultErrorDetail401');
  246. abp.ajax.defaultError403.message = abp.localization.abpWeb('DefaultError403');
  247. abp.ajax.defaultError403.details = abp.localization.abpWeb('DefaultErrorDetail403');
  248. abp.ajax.defaultError404.message = abp.localization.abpWeb('DefaultError404');
  249. abp.ajax.defaultError404.details = abp.localization.abpWeb('DefaultErrorDetail404');
  250. });
  251. })(jQuery);