在REST Web应用程序中进行分页

这是对这个问题的一个更通用的重新表述(通过删除Rails的具体部分)

我不确定如何在REST风格的Web应用程序中的资源上实现分页。 假设我有一个叫做products的资源,你认为哪个是最好的方法,为什么:

1.只使用查询string

例如。 http://application/products?page=2&sort_by=date&sort_how=asc
这里的问题是,我不能使用整个页面caching,也不是很干净,容易记住。

2.使用页面作为资源并查询string进行sorting

例如。 http://application/products/page/2?sort_by=date&sort_how=asc
在这种情况下,看到的问题是http://application/products/pages/1不是唯一的资源,因为使用sort_by=price会产生完全不同的结果我仍然不能使用页面caching。

3.使用页面作为资源和URL段进行sorting

例如。 http://application/products/by-date/page/2
我个人认为使用这种方法没有问题,但是有人告诫我说这不是一个好的方法(他没有给出理由,所以如果你知道为什么不推荐,请告诉我)

任何build议,意见,批评都是值得欢迎的。 谢谢。

我认为版本3的问题更多的是一个“观点”问题 – 您是否将该页面视为资源或页面上的产品。

如果您将该页面看作是资源,那么这是一个完美的解决scheme,因为对页面2的查询总是会产生页面2。

但是,如果您将页面上的产品看作是资源,则说明第2页上的产品可能会发生更改(旧产品已删除,或其他),在这种情况下,URI并不总是返回相同的资源。

例如,客户存储链接到产品列表页面X的链接,下次链接打开时,相关产品可能不再位于页面X上。

我同意Fionn的观点,但我会更进一步,对我说,Page 不是资源,它是请求的属性。 这使我只select了选项1的查询string。 它只是感觉正确。 我真的很喜欢Twitter API的结构。 不要太简单,不要太复杂,有据可查。 无论是好还是坏,当我在围墙上做一些与另一种做法相比,这是我的“去”devise。

HTTP有很好的Range头,它也适用于分页。 你可以发送

 Range: pages=1 

只有第一页。 这可能会迫使你重新思考什么是页面。 也许客户想要一个不同的项目范围。 范围标题也可以用来声明一个命令:

 Range: products-by-date=2009_03_27- 

获得所有比这个date更新的产品

 Range: products-by-date=0-2009_11_30 

获取比该date更早的所有产品。 '0'可能不是最好的解决scheme,但RFC似乎想要一些范围开始。 可能有部署的HTTPparsing器不能parsingunits = -range_end。

如果标题不是(可接受的)选项,我认为第一个解决scheme(全部在查询string中)是一种处理页面的方法。 但是,请正常化查询string(按字母顺序sorting(键=值)对)。 这解决了“?a = 1&b = x”和“?b = x&a = 1”的区别问题。

选项1似乎是最好的,因为您的应用程序将分页视为生成同一资源的不同视图的技术。

话虽如此,URL的scheme是相对不重要的。 如果您将应用程序devise为超文本驱动 (因为所有REST应用程序都必须定义),那么您的客户端将不会自行构build任何URI。 相反,您的应用程序将提供链接到客户端,客户端将遵循它们。

客户可以提供的一种链接是分页链接。

所有这一切的令人愉快的副作用是,即使您改变了分页URI结构的思路,并在下周实施完全不同的事情,您的客户仍然可以继续工作而不做任何修改。

我一直使用选项1的风格。caching不是一个问题,因为在我的情况下,数据经常变化。 如果允许页面的大小可configuration,那么数据不能被caching。

我不觉得这个url很难记住或不干净。 对我来说这是查询参数的好用处。 资源显然是一个产品列表,查询参数只是告诉你如何显示列表 – sorting和哪个页面。

奇怪的是,没有人指出选项3具有特定顺序的参数。 http // application / products / Date / Descending / Name / Ascending / page / 2 and http // application / products / Name / Ascending / Date / Descending / page / 2

指向相同的资源,但有完全不同的url。

对我来说,选项1似乎是最可以接受的,因为它清楚地分开了“我想要的”“我想要的” (它们之间甚至有问号)。 整页caching可以使用完整的URL来实现(无论如何,所有选项都会遇到同样的问题)。

使用URL参数方法的唯一好处是干净的URL。 虽然你必须想出一些方法来编码参数,并无损地解码它们。 当然你可以去URLencode /解码,但它会使urls再丑陋:)

我宁愿使用查询参数偏移和限制。

偏移量 :用于集合中项目的索引。

限制 :用于项目的数量。

客户端可以简单地继续更新偏移量,如下所示

 offset = offset + limit 

为下一页。

该path被认为是资源标识符。 而页面不是资源,而是资源集合的一个子集。 由于分页通常是一个GET请求,所以查询参数最适合分页而不是标题。

我用metamug 。 他们有这个可configuration的。 分页查询metamug

我目前在我的ASP.NET MVC应用程序中使用类似于此的scheme:

例如http://application/products/by-date/page/2

具体是: http://application/products/Date/Ascending/3

不过,我不是很满意这种方法在路由中包含分页和sorting信息。

项目清单(本例中的产品)是可变的。 即下次有人返回包含分页和sorting参数的url时,他们得到的结果可能已经改变。 因此, http://application/products/Date/Ascending/3作为指向定义的,不变的产品集合的唯一URL的想法已经失去了。

寻找最佳实践我碰到了这个网站:

http://www.restapitutorial.com

在资源页面中,有一个链接可以下载.pdf,其中包含作者build议的完整REST最佳实践。 其中除了别的以外,还有一个关于分页的章节。

作者build议使用Range标题和使用查询string参数来添加支持。

请求

HTTP头示例:

 Range: items=0-24 

查询string参数示例:

 GET http://api.example.com/resources?offset=0&limit=25 

其中偏移量是起始项目数量, 限制是返回项目的最大数量。

响应

响应应该包含一个Content-Range标题,表明有多less项目正在被返回,还有多less项目尚未被检索

HTTP头示例:

 Content-Range: items 0-24/66 Content-Range: items 40-65/* 

在.pdf中还有一些更具体的案例的其他build议。

我倾向于认同“页面”不是真正的资源。 另一方面,选项3更清洁,更容易阅读,用户可以更容易地猜到,如果需要的话甚至可以input。 我在选项1和选项3之间被撕裂,但没有看到任何不使用选项3的理由。

另外,虽然它们看起来很不错,但正如某人提到的那样,使用隐藏参数的一个缺点是,用户不能书签或直接链接到特定的页面,而不是查询string或URL段。 这可能是也可能不是一个问题,取决于应用程序,但只是要注意的事情。

我之前使用过解决scheme3(我写了很多django应用程序)。 我不认为这有什么问题。 就像其他两个一样(比如你需要做一些大规模的刮or等),它看起来更干净。 此外,你的用户可以猜测url(如果它是一个面向公众的应用程序),并且人们喜欢能够直接到达他们想要的地方,并且url猜测感觉到了赋权。

我在我的项目中使用以下url:

 http://application/products?page=2&sort=+field1-field2 

这意味着 – “给我页第二页按字段1升序,然后降序字段2”。 或者如果我需要更多的灵活性,我使用:

 http://application/products?skip=20&limit=20&sort=+field1-field2 
 <div style="text-align: right; float: left;"> <table> <tr> <td> <span onclick="GoFirstPage()" title="First page"> <img width="25" alt="Go to first" src="../../Icon/first.png" /> </span> </td> <td><span onclick="GoPrevPage();" title="Previous"> <img width="25" alt="Previous" src="../../Icon/prev.png" /> </span></td> <td><span> <input style="width: 30px; border: none; text-align: right; background: white" readonly="readonly" type="text" value="0" id="txtPageNumber" /> Of </span> </td> <td> <span> <input style="width: 35px; border: none; background: white" readonly="readonly" type="text" id="txtTotalPages" name="name" value="0" /> </span></td> <td> <span title="Next" onclick="GoNextPage();"> <img id="next" width="25" alt="Next" src="../../Icon/next.png" /></span> </td> <td> <span onclick="GoLastPage();" title="Last page"> <img width="25" alt="Go to Last" src="../../Icon/last.png" /> </span> </td> </tr> </table> </div> var FistPage = 0; var NextPage = 10; var PrevPage = 0; var LastPage = 0; var PerPage = 10; var TotalPages = 1; var PageNumber = 1; var Obj = {}; var ArrLen = 0; $(function () { DatePicker(); CustomDate(); $("#dvSalesReport").accordion({ collapsible: true, active: false, autoHeight: false, autoActivate: true }); // $("#spiner").show(); //setTimeout(SearchOrders(), 3000); SearchOrders(); // setTimeout($("#spiner").hide(), 3000); }); function CustomDate() { $("#ddl_Date").change(function () { var DateSelectedIndex = $("#ddl_Date option:selected").index() if (DateSelectedIndex > 6) { $("#tr_frmdat").show(); $("#tr_todat").show(); $("#txt_frmdat").val(''); $("#txt_todat").val(''); } else { $("#tr_frmdat").hide(); $("#tr_todat").hide(); $("#txt_frmdat").val(''); $("#txt_todat").val(''); } }); } function DatePicker() { $('#txt_frmdat').datepicker({ showOn: 'both', buttonImage: 'calendar.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, yearRange: '1920:2020', dateFormat: 'mm/dd/yy' }); $('#txt_todat').datepicker({ showOn: 'both', buttonImage: 'calendar.gif', buttonImageOnly: true, changeMonth: true, changeYear: true, yearRange: '1920:2020', dateFormat: 'mm/dd/yy' }); } /// <reference path="../Webs/Sales/sales-order-review.aspx" /> var DataSalesJson; $("#btnSearchNew").click(function () { SearchOrders(); }) function SearchOrders() { var dataRange = $('#ddl_Date').val(); var SeltdUserIndex = $("#ddl_ShowRslts option:selected").index(); var SelectedSitesIndex = $("#ddl_sites option:selected").index(); var SelectedSitesVal = $('#ddl_sites').val(); var SeltdUserVal = $('#ddl_ShowRslts').val(); var IsShowAll = $('#chk_ShowAll').is(':checked'); var StatusCode = $('#ddl_Status option:selected').val(); var DateFrom = $("#txt_frmdat").val(); var DateTo = $("#txt_todat").val(); $("#spiner").show(); $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", url: 'sales-order-review.aspx/SearchOrdersReview', data: "{'DateRange':'" + dataRange + "','SeltdUserIndex':'" + SeltdUserIndex + "','SeltdUserVal':'" + SeltdUserVal + "','SelectedSitesIndex':'" + SelectedSitesIndex + "','SelectedSitesVal':'" + SelectedSitesVal + "','IsShowAll':'" + IsShowAll + "','StatusCode':'" + StatusCode + "','DateFrom':'" + DateFrom + "','DateTo':'" + DateTo + "'}", // async: false, success: function (response) { DataSalesJson = response; // DataSalesJson = response.d; var OrderList; try { OrderList = JSON.parse(DataSalesJson); } catch (e) { } FistPage = 0; NextPage = parseInt($("#ddlPerPage option:selected").text());; PrevPage = 0; LastPage = 0; PerPage = parseInt($("#ddlPerPage option:selected").text());; TotalPages = 1; PageNumber = 1; Obj = OrderList; if (Obj == null || (typeof Obj) === 'undefined') { ArrLen = 0; } else { ArrLen = Obj.length; } if (ArrLen > 0) { OnSuccessGenerateOrderReview(); } else { $("#lblTotalAmount").text(''); $("#lblEntries").text(''); var html = ''; html += '<h3 style="font-size: medium;cursor: default;background:cornflowerblue;" class="ui-accordion-header ui-corner-top ui-state-default ui-accordion-icons ui-accordion-header-active ui-state-active" role="tab" id="ui-id-3" aria-controls="ui-id-4" aria-selected="true" aria-expanded="true" tabindex="0"><strong>Agent name</strong><span style="left:45%;position:absolute;"><strong>Order ID</strong></span><span style="position: absolute;left: 60%;"></span><span style="float:right;margin-right:10px;"><strong>Order amount</strong></span></h3>'; html += '<table style=" width: 100%;text-align: center;color: red;"><tr><td>No record found</td></tr></table>' $("#dvSalesReport").html(html); } $("#spiner").hide(); }, error: function () { alert("Error"); $("#spiner").hide(); } }); try { $('#anch_SearchBox').show(); } catch (e) { } } function OnSuccessGenerateOrderReview() { $("#dvSalesReport").html(''); var html = ''; PerPage = parseInt($("#ddlPerPage option:selected").text()); $("#lblEntries").text("Entries:" + ArrLen); TotalPages = ArrLen / PerPage; if (typeof TotalPages === 'number') { if (TotalPages % 1 !== 0) { TotalPages = parseInt(TotalPages); TotalPages = TotalPages + 1; } } if (TotalPages == 1) { NextPage = ArrLen; } $("#txtPageNumber").val(PageNumber); $("#txtTotalPages").val(TotalPages); var LastIndex = NextPage; if (LastIndex > ArrLen) { LastIndex = ArrLen; } var Amount_In_Dollar = 0; var Amount_In_Dollar_Approved = 0; var Amount_In_Dollar_Rejected = 0; var Amount_In_Dollar_Pending = 0; for (var k = 0; k < ArrLen; k++) { Amount_In_Dollar += Obj[k].Amount_In_Dollar; try { if (Obj[k].Is_Reviewed == 0) { Amount_In_Dollar_Pending += Obj[k].Amount_In_Dollar; } else if (Obj[k].Is_Reviewed == 1 && Obj[k].ReviewedAs == 1) { Amount_In_Dollar_Approved += Obj[k].Amount_In_Dollar; } else if (Obj[k].Is_Reviewed == 1 && Obj[k].ReviewedAs == 0) { Amount_In_Dollar_Rejected += Obj[k].Amount_In_Dollar; } } catch (e) { } } $("#lblTotalAmount").text('$' + Amount_In_Dollar.toFixed(2)); $("#lblApprovedAmount").text('$' + Amount_In_Dollar_Approved.toFixed(2)); $("#lblRejectedAmount").text('$' + Amount_In_Dollar_Rejected.toFixed(2)); $("#lblPendingAmount").text('$' + Amount_In_Dollar_Pending.toFixed(2)); $("#countDIV").css("display", "block"); $("#div_Details").css("margin-top", "105px"); for (var i = PrevPage; i < LastIndex; i++) { var IsReviewd = Obj[i].Is_Reviewed; var ReviewedAs = Obj[i].ReviewedAs; var IsSharedOrder = Obj[i].SharedOrder; var ShareOrderImg = ''; if (IsSharedOrder) { ShareOrderImg = '<span style="left:62%;position:absolute;"><img src="../../img/Shared.png" title="Shared Order" style="margin-left: 10px;width: 20px;" /></span>'; } if (IsReviewd == 1 && ReviewedAs == 0) { html += '<h3 style="font-size: medium;background:red;color: white;"><span>' + Obj[i].Users_Name + '</span>'; html += '<span style="left:45%;position:absolute;">' + Obj[i].CustomerOrder_ID + '</span>' + ShareOrderImg + ''; // html += '<span onmouseover="ChatPopup(event,' + i + ');" style="position: absolute;left: 60%;"><img src="../../Icon/tooltip.png" /></span>'; html += '<span style="float:right;margin-right:10px;">' + (Obj[i].Currency) + (Obj[i].CustomerOrder_Amount).toFixed(2) + '</span></h3>'; } else if (IsReviewd == 1 && ReviewedAs == 1) { html += '<h3 style="font-size: medium;background: #228B5F;color: white;"><span>' + Obj[i].Users_Name + '</span>'; html += '<span style="left:45%;position:absolute;">' + Obj[i].CustomerOrder_ID + '</span>' + ShareOrderImg + ''; // html += '<span onmouseover="ChatPopup(event,' + i + ');" style="position: absolute;left: 60%;"><img src="../../Icon/tooltip.png" /></span>'; html += '<span style="float:right;margin-right:10px;">' + (Obj[i].Currency) + (Obj[i].CustomerOrder_Amount).toFixed(2) + '</span></h3>'; } else { html += '<h3 style="font-size: medium;"><span>' + Obj[i].Users_Name + '</span>'; html += '<span style="left:45%;position:absolute;">' + Obj[i].CustomerOrder_ID + '</span>' + ShareOrderImg + ''; // html += '<span onmouseover="ChatPopup(event,' + i + ');" style="position: absolute;left: 60%;"><img src="../../Icon/tooltip.png" /></span>'; html += '<span style="float:right;margin-right:10px;">' + (Obj[i].Currency) + (Obj[i].CustomerOrder_Amount).toFixed(2) + '</span></h3>'; } html += '<div>' html += '<div style="min-height:195px;" id=dv1' + i + ' class="reviewReport1">' html += '<div>' html += '<div style="float:left;margin-left: 20px">' html += '<table cellpadding="10" cellspacing="10" style=" margin-left: auto;margin-right: auto;margin-top: 10px;">' html += '<tr><td><strong>Customer Name:</strong></td><td>' + Obj[i].Customer_Name + '</td><td ><span onmouseover="ShowCustPopup(event,' + i + ');"><img src="../../Icon/info.png" /></span></td></tr>' html += '<tr><td><strong>Order Status:</strong></td><td colspan="2">' + Obj[i].OrderStatus_Description + '</td></tr>' html += '</table>' html += '</div>' html += '<div style="float:left;margin-left: 145px">' html += '<table cellpadding="10" cellspacing="10" style=" margin-left: auto;margin-right: auto;margin-top: 10px;">' html += '<tr><td><strong>Added On:</strong></td><td>' + Obj[i].Create_Date + '</td></tr>' html += '<tr><td><strong>Payment Date:</strong></td><td>' + Obj[i].Payment_Date + '</td></tr>' html += '</table>' html += '</div>' html += '<div style="float:left;margin-left: 145px">' html += '<table cellpadding="10" cellspacing="10" style=" margin-left: auto;margin-right: auto;margin-top: 10px;">' var txtCmntID = "Cmnt" + i; var CommentField = ''; // if (IsReviewd) { // CommentField = '<span>Okay</span>'; // } //else { CommentField = '<input style="height:23px;" type="text" id=' + txtCmntID + ' value="' + (Obj[i].Review_Comments == '0' ? '' : Obj[i].Review_Comments) + '" />'; // } html += '<tr><td><strong>Amount:</strong></td><td>' + Obj[i].OrderAmount + '%</td></tr>' html += '<tr><td><strong>Comment:</strong></td><td>' + CommentField + '</td></tr>' // html += '<tr><td><img src="../../img/tick.png" /></td><td><img src="../../img/icn_delete.png" /></td></tr>' html += '</table>'; html += '</div>' html += '</div>' // html += '<div style="clear: both;;">' html += '<table cellpadding="7" cellspacing="0" style=" margin-left: 23px;margin-right: auto;">' var Comments = Obj[i].Comments; var IsDisplayed = 'block'; if (typeof Comments === "undefined") { Comments = ''; IsDisplayed = 'none'; } // html += '<label ><span><strong>References:</strong></span><span style="margin-left: 47px;">' + Obj[i].Reference + '</span></label><br/>' // html += '<label style="display:' + IsDisplayed + ';"><span><strong>Comments:</strong></span><span style="margin-left: 47px;">' + Comments + '</span></label>' html += '<tr ><td><strong>Comments:</strong></td><td colspan="5"><span style="margin-left: 36px;">' + Comments=='0'?'':Comments + '</span></td></tr>' html += '<tr><td><strong>References:</strong></td><td colspan="5"><span style="margin-left: 36px;">' + Obj[i].Reference + '</span></td></tr>'; html += '</table>'; html += '</div>' // html += '<div style="margin-left: 575px;">'; html += '<table><tr>'; //if (IsReviewd) { // html += '<td colspan="2"><span style="margin-left: 65px;"><img src="../../Icon/flag_mark_red.png" title="Already Reviewed"/></span></td>'; //} //else { if (IsReviewd == 1 && ReviewedAs == 0) { html += '<td><span onclick="Accept(' + i + ');"><input type="button" value="Approve" class="button_tick" /></span></td>'; } else if (IsReviewd == 1 && ReviewedAs == 1) { html += '<td><span onclick="Delete(' + i + ');" style="margin-left: 20px;"><input type="button" value="Reject" class="button_delete" /></span></td>'; } else { html += '<td><span onclick="Accept(' + i + ');"><input type="button" value="Approve" class="button_tick" /></span></td>'; html += '<td><span onclick="Delete(' + i + ');" style="margin-left: 20px;"><input type="button" value="Reject" class="button_delete" /></span></td>'; } html += '<tr>'; // } html += '</table>'; html += '</div>'; html += '</div>'; html += '</div>'; } $("#dvSalesReport").html(html); $("#dvSalesReport").accordion("refresh"); $("#dvSalesReport").prepend('<h3 style="font-size: medium;cursor: default;background:cornflowerblue;" class="ui-accordion-header ui-corner-top ui-state-default ui-accordion-icons ui-accordion-header-active ui-state-active" role="tab" id="ui-id-3" aria-controls="ui-id-4" aria-selected="true" aria-expanded="true" tabindex="0"><strong>Agent name</strong><span style="left:45%;position:absolute;"><strong>Order ID</strong></span><span style="position: absolute;left: 60%;"></span><span style="float:right;margin-right:10px;"><strong>Order amount</strong></span></h3>') $("[id^=ui-id-]").css('height', 'auto'); } function ShowCustPopup(e, index) { var html = ''; var UID = Obj[index].Customer_Email_Address; var PWD = Obj[index].Customer_Password; var UserPrefix = '', PasswordPrefix = '', FolderPath = '', CustomerCodeBind = Obj[index].Customer_Code, SiteID = 0, TicketURL = 'http://www.24activ.com/tickets/scp/tickets.php?a=search&query='; if (Obj[index].DOMAIN == 'www.contentproz.net') { UserPrefix = 'wu'; PasswordPrefix = 'wp'; FolderPath = '/webs/signin.aspx?'; SiteID = 1; } else { UserPrefix = 'uid'; PasswordPrefix = 'pas'; FolderPath = '/login.aspx?'; SiteID = 3; } var HomeLink = 'http://' + Obj[index].DOMAIN + FolderPath + UserPrefix + '=' + Encrypt(UID) + '&' + PasswordPrefix + '=' + Encrypt(PWD) + ''; var MailTo = 'OSTicket-PostPage.aspx?w=' + CustomerCodeBind + '&res=' + SiteID; html += '<div>' html += '<table cellspacing="5"><tr>' html += '<td style="width:30px;"> <a title="Home" target="_blank" id="anch_acc" href=' + HomeLink + '><img src="/img/goto_area_customer.png" width="20px" /></a></td>' html += '<td style="width:30px;"> <a title="Email" id="anch_acc" target="_blank" href=' + MailTo + '><img src="/img/mail_customer.png" width="20px" /></a></td>' html += '<td > <a id="anch_acc" title="Ticket" href=' + TicketURL + UID + ' target="_blank"><img src="/img/ticket_customer.png" width="20px" /></a></td>' html += '</tr></table>' html += '</div>' $("#dvCustomerInfo").html(html); var leftPos = e.pageX; var topPos = e.pageY; $('#dvCustomerInfo').toggleClass('opened'); $("#dvCustomerInfo").offset({ left: leftPos, top: topPos }); } //Encyption function Encrypt(stringToEncrpt) { var returnEncrptData = ''; $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", url: 'sales-order-review.aspx/Encryption', data: "{'stringToEncrpt':'" + stringToEncrpt + "'}", async: false, success: function (response) { returnEncrptData = response; }, error: function () { alert("Error"); } }) return returnEncrptData; } $(document).click(function (e) { if (!$(e.target).parents().andSelf().is('.show_alerts')) { $("#dvCustomerInfo").removeClass("opened"); } }); $("#dvCustomerInfo").click(function (e) { e.stopPropagation(); }); function HidePopup() { $("#dvChat").hide(); } function ChatPopup(e, index) { var html = ''; html += '<div>' var Comments = Obj[index].Comments; if (typeof Comments === "undefined") { Comments = ''; } html += '<label><strong>Comments:</strong>' + Comments + '</label><br />' html += '<label><strong>Reference:</strong>' + Obj[index].Reference + '</label>' html += '</div>' $("#dvChat").html(html); var leftPos = e.pageX; var topPos = e.pageY; $("#dvChat").show(); $("#dvChat").offset({ left: leftPos, top: topPos }); } $(document).click(function (e) { if ($(e.target).closest('#dvChat').length != 0) return false; $('#dvChat').hide(); }); function Accept(index) { var orderID = Obj[index].CustomerOrder_ID; var Comments = $("#Cmnt" + index).val(); var MyOrder_ID = parseInt(Obj[index].MyOrder_ID); // var Comments = Obj[index].Comments; $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", url: 'sales-order-review.aspx/Accept', data: "{'orderID':'" + orderID + "','Comments':'" + Comments + "','MyOrder_ID':'" + MyOrder_ID + "'}", async: false, success: function (response) { RemoveObjElement(index); alert("Successfully Accepted") }, error: function () { alert("Error"); } }) } function RemoveObjElement(index) { delete Obj[index] ArrLen = ArrLen - 1; var len = ArrLen; var _PerPage = parseInt($("#ddlPerPage option:selected").text()); if (ArrLen % _PerPage == 0 && index == ArrLen) { PageNumber = PageNumber - 1; } if (index == 0) { var inc = 0; //Delete first element from array object for (var i = 0; i < len; i++) { inc = i + 1; Obj[i] = Obj[inc]; } } else if (index == ArrLen) { NextPage = NextPage - 1; PrevPage = PrevPage - _PerPage; } else if (index > 0 && index < ArrLen) { //Delete element somewhere in the list from array object var inc = 0; for (var i = index; i < len; ++i) { inc = i + 1; Obj[i] = Obj[inc]; } } OnSuccessGenerateOrderReview(); } function Delete(index) { var orderID = Obj[index].CustomerOrder_ID; var Comments = $("#Cmnt" + index).val(); var MyOrder_ID = parseInt(Obj[index].MyOrder_ID); // var Comments = Obj[index].Comments; $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", url: 'sales-order-review.aspx/Delete', data: "{'orderID':'" + orderID + "','Comments':'" + Comments + "','MyOrder_ID':'" + MyOrder_ID + "'}", async: false, success: function (response) { RemoveObjElement(index); alert("Successfully Rejected") }, error: function () { alert("Error"); } }) } function GoLastPage() { if (PageNumber == TotalPages) { return false; } PageNumber = TotalPages; $("#txtPageNumber").val(PageNumber); NextPage = ArrLen; var PageEntry = parseInt($("#ddlPerPage option:selected").text()); var temp = (parseInt(NextPage / PageEntry)) * PageEntry; var isInteger = NextPage / PageEntry; if (typeof isInteger === 'number') { if (isInteger % 1 !== 0) { PrevPage = temp; } else { PrevPage = NextPage - PageEntry; } } OnSuccessGenerateOrderReview(); } function GoFirstPage() { if (PageNumber == 1) { return false; } PageNumber = 1; $("#txtPageNumber").val(PageNumber); PrevPage = 0; NextPage = parseInt($("#ddlPerPage option:selected").text()); OnSuccessGenerateOrderReview(); } function GoPrevPage() { if (PageNumber == 1) { return false; } PageNumber = PageNumber - 1; $("#txtPageNumber").val(PageNumber); NextPage = PrevPage; PrevPage = PrevPage - parseInt($("#ddlPerPage option:selected").text()); OnSuccessGenerateOrderReview(); } function GoNextPage() { if (PageNumber == TotalPages) { return false; } PageNumber = PageNumber + 1; $("#txtPageNumber").val(PageNumber); PrevPage = NextPage; NextPage = NextPage + parseInt($("#ddlPerPage option:selected").text()); OnSuccessGenerateOrderReview(); } function PerPageEntries() { $("#spiner").show(); PerPage = parseInt($("#ddlPerPage option:selected").text()); TotalPages = ArrLen / PerPage; if (typeof TotalPages === 'number') { if (TotalPages % 1 !== 0) { TotalPages = parseInt(TotalPages); TotalPages = TotalPages + 1; } } PageNumber = 1; PrevPage = 0; $("#txtPageNumber").val(PageNumber); $("#txtTotalPages").val(TotalPages); NextPage = parseInt($("#ddlPerPage option:selected").text()) OnSuccessGenerateOrderReview(); $("#spiner").hide(); } function DateFormat(date) { var orderdate = new Date(parseInt(date.replace("/Date(", "").replace(")/", ""), 0)); return orderdate.toDateString(); } function ShowCustomDate() { alert("test") }