一些AspnetCore Odata版本中,返回值中的odata.type属性默认情况下是按对象的全名设置的。但是,有时我们需要将其设置为简单的类型名。而且返回值中的上下文属性也需要进行相应地设置。
可以通过以下方法解决这个问题:
- 修改Startup.cs文件中的services.AddOData()方法:
services.AddOData(opt =>
{
opt.AddModel("odata", GetEdmModel());
}).Configure(opt =>
{
opt.SetUrlKeyDelimiter(ODataUrlKeyDelimiter.Parentheses);
opt.AddModel("odata", GetEdmModel()).Select().Expand().Filter().OrderBy().Count().SetMaxTop(null);
opt.JsonReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
opt.FormatterMappings.SetMediaTypeMappingForFormat("json", new MediaTypeHeaderValue("application/json"));
opt.AddRouteComponents("odata", new DefaultODataBatchHandler(new HttpServer(opt)));
});
- 修改返回值中的上下文类名和OData类型名。对于要返回的模型 MyModel,修改其Controller中的函数:
using Microsoft.AspNet.OData;
[EnableQuery()]
public IQueryable Get()
{
this.HttpContext.Response.Headers.Add("ContextType", "application/json;odata.metadata=minimal");
var results = new List
{
new MyModel(),
}.AsQueryable();
return results;
}
将返回值的HttpResponse的Header中参数“ContextType”设置为application/json;odata.metadata=minimal,这样可以使返回的上下文类名为简单的类型名;并将返回值设为as_Queryable类型的对象,以设置odata.type属性值为“#MyModel”。
- 修改服务中的EdmModel对象为:
EdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EnableLowerCamelCase();
var entitySet = "Models";
var entityTypeConfiguration = odataBuilder.EntitySet(entitySet).(s =>
{
s.HasKey(x => x.Id);
s.MapKey(x => x