Hi,
We have been struggling to implement a kendo-ui grid for several days consuming data from a WCF service proxy. All of our data tests in Fiddler work correctly and if we hard code a request in our Get action in the controller we can see the service is working and our dataset it retrieved. We think the issue is that the URL is request is not an Odata request. I have looked through to see if there is an Html helper to specify Odata in the index.chtml grid builder but have not found anything. We are pretty close to giving up on Kendo-ui completely I feel like this should be much easier to implement.
index.chtml
Customer Controller
BusinessLogic customer controller (providing OData)
We have been struggling to implement a kendo-ui grid for several days consuming data from a WCF service proxy. All of our data tests in Fiddler work correctly and if we hard code a request in our Get action in the controller we can see the service is working and our dataset it retrieved. We think the issue is that the URL is request is not an Odata request. I have looked through to see if there is an Html helper to specify Odata in the index.chtml grid builder but have not found anything. We are pretty close to giving up on Kendo-ui completely I feel like this should be much easier to implement.
index.chtml
@model IEnumerable<Application.ServiceProxy.CustomerDTO>
@(Html.Kendo().Grid(Model)
.Name(
"grid"
)
.Columns(columns => {
columns.Bound(c => c.customerID).Width(100);
columns.Bound(c => c.name1).Width(100);
columns.Bound(c => c.matchcode).Width(100);
columns.Bound(c => c.city).Width(100);
columns.Bound(c => c.postalCode).Width(100);
})
.Pageable()
.Sortable()
.Scrollable()
.Filterable()
//.HtmlAttributes(new { style = "height:430px;" })
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Read(read => read.Action(
"Get"
,
"Customer"
)
)
Customer Controller
using
System;
using
System.Collections.Generic;
using
System.Net.Http;
using
System.Web.Mvc;
using
Kendo.Mvc.UI;
using
Kendo.Mvc.Extensions;
using
BusinessLogic.Models;
using
System.Web;
using
System.Linq;
using
Newtonsoft.Json;
using
Application.ServiceProxy;
using
System.Web.Http;
using
System.Web.Http.OData.Query;
using
System.Web.Http.OData;
namespace
Application.Controllers
{
public
class
CustomerController : Controller
{
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public
IEnumerable<ServiceProxy.CustomerDTO> Get()
{
var customer = odataService.Customer.Take(10);
return
customer.AsEnumerable();
}
public
ActionResult Index() {
return
View() ;
}
}
}
BusinessLogic customer controller (providing OData)
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Net;
using
System.Web;
using
System.Net.Http;
using
System.Web.Http;
using
BusinessLogic.Models;
using
System.Web.Http.OData.Query;
using
System.Web.Http.OData;
namespace
BusinessLogic.Controllers
{
//public class CustomerController : CPSGlobalAPIController
public
class
CustomerController : EntitySetController<CustomerDTO,
int
>
{
protected
cpsGlobalEntities entity =
new
cpsGlobalEntities();
#region mapper
private
IQueryable<CustomerDTO> mapCustomer()
{
return
from c
in
entity.customer
select
new
CustomerDTO()
{
customerID = c.customerID,
matchcode = c.matchcode,
salesOrganizationCompanyCode = c.salesOrganization.companyCode,
salesOrganizationID = c.salesOrganizationID,
salesOrganizationName = c.salesOrganization.name,
statusID = c.statusID,
statusPrefix = c.status.prefix,
statusTranslationKey = c.status.translationKey,
serviceLevelStatusID = c.serviceLevelStatusID,
serviceLevelPrefix = c.status1.prefix,
serviceLevelTranslationKey = c.status1.translationKey,
systemID = c.systemID,
dunsNumber = c.dunsNumber,
mediaIDLogo = c.mediaIDLogo,
salesOrganization = c.salesOrganization.companyCode,
inventoryManagerID = c.inventoryManager.inventoryManagerID,
inventoryManagerAddressID = c.inventoryManager.addressID,
customerExternalSystemID = c.customerExternalSystemID,
internationalGroup = c.internationalGroup,
division = c.division,
corporateID = c.corporateID,
#region duplicated items for improved list view
name1 = c.customerExternalSystem.address.name1,
postalCode = c.customerExternalSystem.address.postalCode,
city = c.customerExternalSystem.address.city,
stateCode = c.customerExternalSystem.address.state.stateCode,
countryCode = c.customerExternalSystem.address.country.countryCode
#endregion
};
}
#endregion
#region GET
#region GET all
[Queryable]
public
override
IQueryable<CustomerDTO> Get()
{
return
mapCustomer().AsQueryable();
}
#endregion
#region GET by ID
protected
override
CustomerDTO GetEntityByKey(
int
key)
{
//return mapCustomer().FirstOrDefault(p => p.customerID == key);
var cust = (from c
in
mapCustomer() where c.customerID == key select c).FirstOrDefault();
if
(cust.inventoryManagerAddressID !=
null
)
{
AddressController adC =
new
AddressController();
cust.inventoryManagerAddressDTO = adC.Get((
int
)cust.inventoryManagerAddressID);
}
if
(cust.customerExternalSystemID !=
null
)
{
CustomerExternalSystemController cesC =
new
CustomerExternalSystemController();
cust.customerExternalSystemDTO = cesC.Get((
int
)cust.customerExternalSystemID);
}
if
(cust ==
null
)
throw
new
HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
return
cust;
}
#endregion
#region POST
protected
override
CustomerDTO CreateEntity(CustomerDTO customerDTO)
{
var customer =
new
customer()
{
matchcode = customerDTO.matchcode,
salesOrganizationID = customerDTO.salesOrganizationID,
statusID = customerDTO.statusID,
serviceLevelStatusID = customerDTO.serviceLevelStatusID,
mediaIDLogo = customerDTO.mediaIDLogo,
systemID = customerDTO.systemID,
customerExternalSystemID = customerDTO.customerExternalSystemID,
internationalGroup = customerDTO.internationalGroup,
division = customerDTO.division,
corporateID = customerDTO.corporateID,
inventoryManagerID = customerDTO.inventoryManagerID,
dunsNumber = customerDTO.dunsNumber
};
entity.customer.Add(customer);
entity.SaveChanges();
return
GetEntityByKey(customer.customerID);
}
protected
override
int
GetKey(CustomerDTO customer)
{
return
customer.customerID;
}
#endregion
#region Put
protected
override
CustomerDTO UpdateEntity(
int
key, CustomerDTO customerDTO)
{
var originalCustomer = entity.customer.Find(key);
originalCustomer.matchcode = customerDTO.matchcode;
originalCustomer.salesOrganizationID = customerDTO.salesOrganizationID;
originalCustomer.statusID = customerDTO.statusID;
originalCustomer.serviceLevelStatusID = customerDTO.serviceLevelStatusID;
originalCustomer.mediaIDLogo = customerDTO.mediaIDLogo;
originalCustomer.systemID = customerDTO.systemID;
originalCustomer.customerExternalSystemID = customerDTO.customerExternalSystemID;
originalCustomer.inventoryManagerID = customerDTO.inventoryManagerID;
originalCustomer.dunsNumber = customerDTO.dunsNumber;
originalCustomer.internationalGroup = customerDTO.internationalGroup;
originalCustomer.division = customerDTO.division;
originalCustomer.corporateID = customerDTO.corporateID;
entity.SaveChanges();
return
GetEntityByKey(key);
}
#endregion
#region PATCH
#endregion
#region DELETE
public
override
void
Delete([FromODataUri]
int
key)
{
var customer = entity.customer.Find(key);
if
(customer ==
null
)
{
throw
new
HttpResponseException(HttpStatusCode.NotFound);
}
entity.customer.Remove(customer);
entity.SaveChanges();
}
#endregion
}
}