Sorry for my late reply. There are a couple of different ways to approach this. Personally I would use ListData.svc
and jQuery for this. I tend to use Kendo UI for my frontend work but you could use jQuery UI or just roll your own template with CSS.
Here is an example jQuery call to ListData.svc
:
$.ajax({
type: "GET",
url: "../_vti_bin/ListData.svc/ListName",
dataType: "json"
}).done(function (data, textStatus, jqXHR) {
successFunction(data);
}).fail(function (jqXHR, textStatus, errorThrown) {
errorFunction(jqXHR);
});
There are some things you have to lookout for when using REST in SharePoint 2010.
- List names are all together Pascal case. So a list titled "Work Items" would be accessed via the URL
../_vti_bin/ListData.svc/WorkItems
.
- Field names are based on the title, not the internal name. So on the server-side where you would use
item["Author"]
to get the person who created the item, via the 2010 REST service it is Created
. The best advice I have for you in this is to use a tool like Dev HTTP Client
for Chrome that can let you craft the HTTP request and see the JSON that you get back.
- Use
$expand
and $select
and other operators for filtering, etc.
Here is an example of a grid that I have on a production site in SharePoint 2010 using Kendo UI grid and the ListData.svc
. I blurred the document titles a little since the might be sensitive.

Here is the code used to generate that grid. Note that I am useing MVVM to declare the grid. You would likely just want to use the programmatic method explained in the Kendo UI API reference.
psApp.releasedProcesses = new kendo.data.DataSource({
autoSync: false,
serverPaging: false,
pageSize:10,
group: { field: "OwnersGroup", aggregates: [ { field: "OwnersGroup", aggregate: "count" } ] },
aggregate: [ { field: "OwnersGroup", aggregate: "count" } ],
pageable: true,
type: "odata",
transport: {
read: function (options) {
return $.ajax({
type: "GET",
url: "../_vti_bin/ListData.svc/ReleasedProcesses?&orderby=OwnersGroup&$inlinecount=allpages",
dataType: "json",
data: options.data
}).done(function (data, textStatus, jqXHR) {
options.success(data);
}).fail(function (jqXHR, textStatus, errorThrown) {
options.error(jqXHR);
});
}
}
});
<div id="released-grid-view"
data-role="grid"
data-selectable="single"
data-auto-bind="true"
data-pagesize="15"
data-pageable="{ pagesize: 15, pageSizes: [10,15,20,25], refresh:true}"
data-columns='[
{
"field": "ProcessDocID",
"title": "Title",
"template": kendo.template($("#rel-title-column").html())
},
{
"field": "DocumentRev",
"title": "Revision",
"width": "100px"
},
{
"field": "DocTypeValue",
"title": "Doc Type",
"width": "100px"
},
{
"field": "OwnersGroup",
"title": "Owner Group",
"groupHeaderTemplate": "#= value # (#= count#)"
},
{
"field": "Modified",
"title": "Last Modified",
"template": kendo.template($("#created-column").html()),
"width": "120px",
"filterable": {
"ui": "datepicker",
extra: false,
operators: {
date: {
eq: "Is equal to",
neq: "Is not equal to",
gte: "Is after or equal to",
gt: "Is after",
lte: "Is before or equal to",
lt: "Is before"
}
}
}
}
]'
data-scrollable="true"
data-filterable="true"
data-sortable="true"
data-source="psApp.releasedProcesses"
></div>
<script type="text/x-kendo-ui-template" id="rel-title-column">
<div class="grid-title">
<a href="${__metadata.media_src}">
<img style="height:25px;" src="icons/office/pdf-small.png" > ${Title}
</a>
</div>
</script>
<script type="text/x-kendo-ui-template" id="created-column">
#= moment(Created).format("MM/DD/YYYY")#
</script>