没有元数据操作的Odata无法正常工作

时间:2016-01-08 13:00:04

标签: c# asp.net-web-api odata asp.net-web-api-odata

我尝试了这篇文章中描述的解决方案: Original article

如上所述:

var defaultConventions = ODataRoutingConventions.CreateDefault();
var conventions = defaultConventions.Except(
        defaultConventions.OfType<MetadataRoutingConvention>());
config.MapODataServiceRoute(
        routeName: "ODataRoute",
        routePrefix: null,
        model: model,
        pathHandler: new DefaultODataPathHandler(),
        routingConventions: conventions);

一切正常,没有更多的元数据信息。标准请求工作正常但是未绑定的操作和功能不再起作用我得到了404响应。

我将操作注册到Odata模型构建器,如:

var validateEmailAction = builder.Action("ValidateEmail");
        validateEmailAction.Parameter<string>("Email");

在控制器中我有:

[HttpPost]
[ODataRoute("ValidateEmail")]
public async Task<IHttpActionResult> ValidateEmail(ODataActionParameters parameters)
{
}

任何建议如何实现隐藏Odatametada但仍然有动作/功能?

2 个答案:

答案 0 :(得分:3)

ODataRoutingConventions.CreateDefault()

将创建路由约定列表 WITHOUT 属性路由。

虽然未绑定的操作和功能需要属性路由。

所以,你必须改为呼叫:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/angular.js"></script>
<script type="text/javascript" src="js/node_modules/angular-route/angular-route.js"></script>

答案 1 :(得分:0)

如上所述,它使用默认的属性路由,但它也需要config和edm模型属性。

var edmModel = builder.GetEdmModel();
var defaultConventions  =ODataRoutingConventions.CreateDefaultWithAttributeRouting(config,edmModel);
var conventions = defaultConventions.Except(defaultConventions.OfType<MetadataRoutingConvention>());
        var route = config.MapODataServiceRoute(
            "odata",
            null,
           edmModel,
            pathHandler: new DefaultODataPathHandler(),
            routingConventions: conventions);