自定义来自 asp.net web api 的 odata 输出 [英] customizing odata output from asp.net web api

查看:22
本文介绍了自定义来自 asp.net web api 的 odata 输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用新的 ASP.NET webapi odata(根据 Nuget,4.0.0 版最后于 27/2/2013 发布)

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

基本上我按照这里的描述做:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Basically I'm doing it as described here: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

我正在发布我的数据传输对象并创建了 odata atom pub 提要,但我想对其进行更多控制.我主要希望能够做到以下几点:

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:

  • 决定提要的标题、作者和更新元素的内容
  • 决定是否有编辑链接
  • 更改 <category term="X"m:type 中显示的内容,这些子属性是我的应用程序中的类.目前,他们公开了具有完整命名空间的 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);
    }
}

并使用,

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

2) 自定义编辑链接

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 web api 的 odata 输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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