C# 属性路由:";不是有效的ODataPath模板";
我一整天都在努力解决这个问题,我想我已经找到了所有关于这个问题的答案。也许我很特别,也许我在做一些愚蠢的事情。 我最近从V3升级到V4(我想)。我使用System.Web.OData名称空间,这应该可以 这是我的网页C# 属性路由:";不是有效的ODataPath模板";,c#,c#-4.0,asp.net-web-api2,odata,C#,C# 4.0,Asp.net Web Api2,Odata,我一整天都在努力解决这个问题,我想我已经找到了所有关于这个问题的答案。也许我很特别,也许我在做一些愚蠢的事情。 我最近从V3升级到V4(我想)。我使用System.Web.OData名称空间,这应该可以 这是我的网页 using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.OData.Builder; using System.Web.OD
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
using System.Web.OData.Routing;
using System.Web.OData.Routing.Conventions;
using GizmoAPI.Models;
namespace GizmoAPI
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Counterparty>("Counterparties");
config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
config.EnableDependencyInjection();
config.MapHttpAttributeRoutes();
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
config.AddODataQueryFilter();
var cors = new System.Web.Http.Cors.EnableCorsAttribute("http://localhost:56248", "*", "*");
config.EnableCors( cors);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
config.EnableSystemDiagnosticsTracing();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web.Http;
使用System.Web.OData.Builder;
使用System.Web.OData.Extensions;
使用System.Web.OData.Routing;
使用System.Web.OData.Routing.Conventions;
使用GizmoAPI.Models;
名称空间GizmoAPI
{
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
ODataModelBuilder=新ODataConventionModelBuilder();
建造商实体集(“交易对手”);
config.Select().Expand().Filter().OrderBy().MaxTop(null.Count());
config.EnableDependencyInjection();
config.maphttpAttribute路由();
config.MapODataServiceRoute(“odata”,“odata”,builder.GetEdmModel());
config.AddODataQueryFilter();
var cors=new System.Web.Http.cors.EnableCorsAttribute(“http://localhost:56248", "*", "*");
配置使能cors(cors);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(新的System.Net.Http.Headers.MediaTypeHeaderValue(“text/html”);
config.EnableSystemDiagnosticsTracing();
}
}
}
这是一个基本控制器:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.OData;
using System.Web.OData.Routing;
using GizmoAPI.Models;
namespace GizmoAPI.Controllers
{
public class CounterpartiesController : ODataController
{
private GizmoEntities db = new GizmoEntities();
// GET odata/Counterparties
[EnableQuery]
public IQueryable<Counterparty> GetCounterparties()
{
return db.Counterparties;
}
// GET odata/Counterparties(5)
[EnableQuery]
[ODataRoute("{key}")]
public SingleResult<Counterparty> GetCounterparty([FromODataUri] int key)
{
return SingleResult.Create(db.Counterparties.Where(counterparty => counterparty.CounterpartyID == key));
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用System.Web.Http;
使用System.Web.Http.ModelBinding;
使用System.Web.OData;
使用System.Web.OData.Routing;
使用GizmoAPI.Models;
命名空间GizmoAPI.Controllers
{
公共类交易对手控制器:ODataController
{
私有GizmoEntities db=新GizmoEntities();
//获取odata/交易对手
[启用查询]
公共可查询交易对手()
{
返回db.交易对手;
}
//获取odata/交易对手(5)
[启用查询]
[ODataRoute(“{key}”)]
公共单结果获取交易对手([FromODataUri]int-key)
{
返回SingleResult.Create(db.Counterparties.Where(counterparty=>counterparty.CounterpartyID==key));
}
然后我尝试调用URL作为
或
或者在这一点上真的是什么。我觉得我缺少某种配置来激活它。我得到错误“控制器“对手”中操作“getcounterparties”上的路径模板“{key}”不是有效的OData路径模板。找不到段“{key}”的资源。”您是否尝试将方法重命名为GetCounterParties([FromODataUri]int key) 是否删除OdataRoute属性?这不是对我的问题的100%修复,因为我添加了odata作为标记 比较ODataController和ApicController(WebAPI2.2),我找不到任何不切换到后者的理由。
因此,我将控制器更改为继承APIController,并将odata的所有引用切换到WebAPI版本。事实上,上面的代码与前面提到的控制器几乎相同,ODataRoute现在变成了简单的“路由”。代码编译得非常好,而且更易于管理。如果我的操作的返回类型是iqueryable,我甚至可以使用odata筛选器。是的。这很有效。但我要做的是在控制器内路由。我有两个不同版本的视图(实体)我希望用户能够获得。因此api/交易对手将获得普通版本,也许api/交易对手/高级将获得该视图的高级版本。