Могу ли я использовать результат OData с серверной страницей в ASP.NET MVC?

Я хотел бы использовать результат OData с серверной страницей.

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

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

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

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

2 ответа

Решение

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

Предостережение: JSON, который вы опубликовали (с "__next") - это старый формат OData JSON, который иногда называют "подробным JSON". Клиент служб данных WCF не поддерживает этот формат. Он поддерживает только 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

Если вы используете MVC и OData, я настоятельно рекомендую сделать это с помощью веб-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

Другие вопросы по тегам