我正在使用新的 ASP.NET webapi odata(版本 4.0.0 根据 Nuget 最新发布时间为 2013 年 2 月 27 日)
基本上我是按照这里描述的方式进行的:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api
我正在发布我的数据传输对象,并且创建了 odataatom pub feed,但我希望对其有更多的控制权。我主要希望能够执行以下操作:
- 决定 Feed 的标题、作者和更新元素的内容
- 决定是否有编辑链接
- 更改
<category term="X"
中显示的内容并在m:type
在我的应用程序中的类的子属性中。目前,他们公开了带有完整命名空间的 C# 类名,但我不想公开这一点。
谢谢。
最佳答案
OData 媒体类型格式化程序现在更具可扩展性。示例如下。
1) 决定提要的标题、作者和更新元素的内容
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);
}
}
并按上述方式注册自定义序列化器提供程序。
我们仍然不支持场景 3,即别名类型名称和命名空间。
关于asp.net-web-api - 自定义 asp.net web api 的 odata 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15132667/