.NET Core OData Beta手动应用过滤器返回查询无效错误求助
搞定.NET Core OData Beta版$filter属性不可用的问题
嘿,我来帮你捋捋这个问题——为啥控制器明明返回了正确数据,前端却收到Name属性不能用在$filter的错误?其实是OData Beta版的严格校验在搞事情:哪怕你手动处理了过滤器,OData的中间层会先校验查询参数,如果你的实体模型没明确声明Name属性允许被筛选,就会直接抛出这个错误。
下面是具体的解决步骤,一步步来:
1. 给实体属性开筛选权限
最直接的方式是在你的实体类里,给Name属性加上[Filterable]特性,告诉OData这个属性可以被筛选:
public class ODataTestEntity { public int Id { get; set; } [Filterable] // 标记这个属性支持$filter public string Name { get; set; } // 其他属性... }
要是你不想一个个加特性,也可以在OData模型构建的时候全局配置:
// 在Program.cs或者OData配置类里 builder.Services.AddControllers().AddOData(opt => { opt.AddRouteComponents("api", BuildEdmModel()) .Select() .Filter() // 全局启用筛选功能 .OrderBy(); }); private static IEdmModel BuildEdmModel() { var modelBuilder = new ODataConventionModelBuilder(); var odataTestSet = modelBuilder.EntitySet<ODataTestEntity>("ODataTest"); // 显式设置Name属性允许被筛选 odataTestSet.EntityType.Property(e => e.Name).IsFilterable = true; return modelBuilder.GetEdmModel(); }
2. 要是完全手动处理过滤器,可关闭自动校验
如果你打算自己全权处理筛选逻辑,不想让OData瞎掺和校验,可以关闭默认的查询特性校验:
builder.Services.AddControllers().AddOData(opt => { opt.AddRouteComponents("api", BuildEdmModel()) .EnableQueryFeatures(null) // 关闭OData自动查询校验 .Filter(); });
不过这个方法要谨慎用,毕竟关闭校验可能带来安全风险,优先推荐第一种配置模型的方式。
3. 确认路由和OData配置匹配
你的请求路由是/api/ODataTest,要确保OData配置里的路由前缀是api(就是上面代码里的AddRouteComponents("api", ...)),这样请求才能正确匹配到OData的处理逻辑,让你的模型配置生效。
4. 查元数据确认配置生效
可以访问/api/$metadata查看生成的EDM模型,看看Name属性有没有标注可筛选。正确的元数据应该类似这样:
return (<Property Name="Name" Type="Edm.String" Nullable="false" /> <Annotation Term="Org.OData.Capabilities.V1.FilterRestrictions"> <Record> <PropertyValue Property="Filterable" Bool="true" /> </Record> </Annotation> )
按照上面的步骤调整后,OData就会允许Name属性用于$filter查询,前端就能收到你控制器返回的正确数据啦。
内容的提问来源于stack exchange,提问作者johnny 5
相关产品推荐
相关产品推荐

