我有一个OData v4不起作用的动作方法; 但请注意它工作正常OData v3(我显然正在尝试更新我的项目)
OData行动方法:
[HttpPost]
public Translation Translate(ODataActionParameters parameters)
{
// Implementation
}
Run Code Online (Sandbox Code Playgroud)
组态:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Page>("Pages");
//etc (Other Entity Sets)
var pageEntityType = builder.EntityType<Page>();
var translateAction = pageEntityType.Collection.Action("Translate");
translateAction.Parameter<Guid>("pageId");
translateAction.Parameter<string>("cultureCode");
translateAction.Returns<Translation>();
//etc (Other Actions)
var route = config.MapODataServiceRoute("OData_CMS", "odata/cms", builder.GetEdmModel());
Run Code Online (Sandbox Code Playgroud)
客户端AJAX调用:
var data = {
pageId: $("#CultureSelector_PageId").val(),
cultureCode: $("#CultureSelector_CultureCode").val()
};
$.ajax({
url: "/odata/cms/Pages/Translate",
type: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(data),
dataType: "json",
async: false
})
.done(function (json) {
//etc
Run Code Online (Sandbox Code Playgroud)
我试着看看版本4中OData操作的设置是否有任何改变,但看起来是一样的(参考:使用ASP.NET …
我正在从两个Web API OData示例构建一个示例,每个示例都可以作为一个单独的项目正常工作.但是当我添加第二个ODataController类时,该站点不再适用于以前工作的OData路径模板.这里有更多细节:
只要其控制器(ProductsController)是唯一的控制器,以下操作就可以正常工作:
[HttpGet]
[ODataRoute("GetSalesTaxRate(state={state})")]
public IHttpActionResult GetSalesTaxRate([FromODataUri] string state)
{
return Ok(GetRate(state));
}
Run Code Online (Sandbox Code Playgroud)
现在我添加一个带有一些动作的新控制器(MoviesController).
我扩展了Owin Startup类,所以它看起来像这样:
public void Configuration(IAppBuilder builder)
{
var config = new HttpConfiguration();
config.MapODataServiceRoute(routeName: "functions route", routePrefix: "functions", model: FunctionStartup.GetEdmModel());
config.MapODataServiceRoute(routeName: "actions route", routePrefix: "actions", model: ActionStartup.GetEdmModel());
builder.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试执行Web请求(URLBASE/functions/$ metadata)时,我收到以下错误:
System.InvalidOperationException控制器"Products"中的操作"GetSalesTaxRate"上的路径模板"GetSalesTaxRate(state = {state})"不是有效的OData路径模板.找不到段"GetSalesTaxRate"的资源.
控制器映射到不同的路由("功能"和"操作").可能是问题是每条路线都映射到自己的EdmModel?
UPDATE.我检查过我可以添加更多控制器,只要它们引用相同的EDM模型.但是,一旦我引入第二个模型(并从MapODataServiceRoute引用它),整个服务就会中断.有没有解决方法来支持多个模型?
更新2.如果我继承DefaultHttpControllerTypeResolver并且只启用单个控制器(其中任何一个),那么也可以正常工作.但我仍然感到疑惑为什么使用不同型号的多个控制器都会失败.