2013-06-13 1 views
0

Я хотел бы получить результат OData, выгруженный сервером.Могу ли я использовать результат вывода OData с помощью сервера ASP.NET MVC?

Это означает, что код JSON включает в себя элемент

"__next": "http://server/odata.svc/table?$skiptoken=guid'4dda1cd9-7eff-423f-a314-08edf26a22e8'" 

Как сделать это в ASP.NET MVC? Я вижу довольно много примеров для использования OData, но никто не обрабатывает выгружаемые данные.

Я совершенно новый и для OData, и для MVC, поэтому, пожалуйста, будьте как можно ясны в ответах. ;-)

ответ

1

Основным способом использования OData в .NET является клиентская библиотека служб данных WCF. В Visual Studio вы можете щелкнуть правой кнопкой мыши по проекту и выбрать «Добавить служебную ссылку», чтобы начать. Это «Добавить ссылку на службу» использует клиентскую библиотеку служб данных WCF под капотом. Для получения общей информации о том, как использовать клиентскую библиотеку, проверить документацию MSDN здесь: http://msdn.microsoft.com/en-us/library/cc668772.aspx

предостережение, хотя: JSON вы вывесили (с "__next") старый формат OData JSON, иногда называют «Verbose JSON ». Клиент WCF Data Services не поддерживает этот формат. Он поддерживает только Atom и новый формат JSON. Пока ваш сервер может поддерживать Atom или новый v3 JSON, это не должно быть проблемой для вас.

Что касается вашего фактического вопроса, вы можете использовать метод .GetContinuation() на объекте QueryOperationResponse. Например:

// "DemoService" is the auto-generated subclass of DataServiceContext created when you run "Add Service Reference" 
DemoService context = new DemoService(new Uri(<url to the service root>)); 
var firstPage = context.Customers.Execute() as QueryOperationResponse<Customer>; 
var token = firstPage.GetContinuation(); 
if (token != null) 
    var secondPage = context.Execute<Customer>(token); 

Очевидно, что вы, вероятно, хотите, чтобы превратить это в петлю, но это должно дать вам основную идею использования API. Для получения дополнительной информации см. Эту страницу в MSDN: http://msdn.microsoft.com/en-us/library/ee358711.aspx

+0

Спасибо, Джен, это очень помогает! Теперь ваш пример собирает все страницы результатов сразу, но для веб-приложения лучше не предоставлять ссылку для продолжения посетителю? Есть ли что-нибудь готовое для привязки адреса продолжения к пейджинговой ссылке в представлении? Проблема, конечно, в том, что ссылка продолжения не должна ссылаться непосредственно на поток OData, а на новую страницу просмотра. – Peter

+0

Это отличный вопрос, но у меня нет большого ответа для вас (частично потому, что я просто не очень хорошо знаком с привязкой данных). Я не знаю каких-либо механизмов продолжения, кроме GetContinuation(), поэтому любая привязка к привязке данных должна быть настраиваемым кодом, который вы пишете поверх GetContinuation(). –

+0

Думая об этом больше, я думаю, нет готового пейджингового решения, связанного с продолжением OData, тем более, что продолжение - только вперед. Пользователи ожидают прямой и обратный пейджинг. – Peter

0

Если вы делаете MVC и OData, я бы настоятельно рекомендовал сделать это с помощью Web API и не возиться со всеми сложностями конфигурации WCF WCF. Вот что ваш контроллер хотел бы использовать с MVC Web API: (очень простой и чистый).

public class ProductController : EntitySetController<Product, int> 
{ 
    private readonly IUnitOfWork _unitOfWork; 

    public ProductController(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    public override IQueryable<Product> Get() 
    { 
     return _unitOfWork.Repository<Product>().Query().Get(); 
    } 

    protected override Product GetEntityByKey(int key) 
    { 
     return _unitOfWork.Repository<Product>().FindById(key); 
    } 

    protected override Product UpdateEntity(int key, Product update) 
    { 
     update.State = ObjectState.Modified; 
     _unitOfWork.Repository<Product>().Update(update); 
     _unitOfWork.Save(); 
     return update; 
    } 

    public override void Delete([FromODataUri] int key) 
    { 
     _unitOfWork.Repository<Product>().Delete(key); 
     _unitOfWork.Save(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     _unitOfWork.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

Вы видите это сообщение, для полного проходных http://blog.longle.net/2013/06/18/mvc-4-web-api-odata-entity-framework-kendo-ui-grid-datasource-with-mvvm.

Смежные вопросы