从定制网页asp.net API ODATA输出 [英] customizing odata output from asp.net web api

查看:221
本文介绍了从定制网页asp.net API ODATA输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用(根据的NuGet版本4.0.0上次发布27/2/2013)新的ASP.NET的WebAPI ODATA

I'm using the new ASP.NET webapi odata (version 4.0.0 last published 27/2/2013 according to Nuget)

基本上我做如下描述:<一href=\"http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api\">http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

我发表我的数据传输对象和ODATA原子酒馆饲料创建,但我想有超过它的一些更多的控制。我主要是想能够做到以下几点:

I'm publishing my data transfer objects and the odata atom pub feed is created but I'd like to have some more control over it. Mainly I'd like to be able to do the following:


  • 决定什么那张标题,作者和更新的元素为饲料

  • 决定是否有编辑链接

  • 改变是什么所示&LT;类项=X玛:子属性类型那是在我的应用程序类。目前,他们与公开的全部命名空间中的C#类的名字,但我不希望暴露这一点。

  • decide what goes on the title, author and updated elements for the feed
  • decide whether or not to have the edit links
  • change what is shown in <category term="X"and in m:type in sub properties that are classes in my application. Currently they expose the c# class names with the full namespace but I don't want to expose this.

感谢。

推荐答案

的OData的媒体类型格式现在更可扩展性。样品跟进。

The OData media type formatter is more extensible now. Samples follow.

1)决定什么那张标题,作者和更新的元素为饲料

1) decide what goes on the title, author and updated elements for the feed

public class AtomMetadataFeedSerializer : ODataFeedSerializer
{
    public AtomMetadataFeedSerializer(IEdmCollectionTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataFeed CreateODataFeed(IEnumerable feedInstance, ODataSerializerContext writeContext)
    {
        ODataFeed feed = base.CreateODataFeed(feedInstance, writeContext);
        feed.Atom().Title = new AtomTextConstruct { Kind = AtomTextConstructKind.Text, Text = "My Awesome Feed" };
        return feed;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsCollection() && edmType.AsCollection().ElementType().IsEntity())
        {
            // feed serializer
            return new AtomMetadataFeedSerializer(edmType.AsCollection(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

和使用注册自定义序列化提供商,

And register the custom serializer provider using,

config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create(new CustomSerializerProvider(), new DefaultODataDeserializerProvider()));

2)自定义编辑链接

2) customize edit links

public class CustomEntityTypeSerializer : ODataEntityTypeSerializer
{
    public CustomEntityTypeSerializer(IEdmEntityTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataEntry CreateEntry(EntityInstanceContext entityInstanceContext, ODataSerializerContext writeContext)
    {
        ODataEntry entry = base.CreateEntry(entityInstanceContext, writeContext);
        if (notProduceEditLinks)
        {
            entry.EditLink = null;
        }

        return entry;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsEntity())
        {
            // entity type serializer
            return new CustomEntityTypeSerializer(edmType.AsEntity(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

和注册自定义序列化提供如上。

and register the custom serializer provider as above.

我们仍然不支持方案3即走样类型名称和命名空间。

We still don't support scenario 3 i.e aliasing type names and namespaces.

这篇关于从定制网页asp.net API ODATA输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆