我在这里变得疯狂。我尝试了很多不同的方法,我通过网络找到了。但似乎无法得到这项工作。这是我尝试的最后一件事。
modelBuilder.EntitySet<User>("Users").EntityType.Action("IsEmailAvailable")
.Returns<bool>()
.Parameter<string>("email");
我像这样配置我的实体。
[HttpPost]
public bool IsEmailAvailable(ODataActionParameters parameters)
{
return true;
}
这是我控制器中的动作。
当我做
之类的事情时我得到了预期的诱惑。但是,如果我这样做
我收到了错误:
消息:&#34; OData路径无效。&#34;,ExceptionMessage:&#34;无效 检测到行动。 &#39; IsEmailAvaliable&#39;不是可以绑定的动作 &#39; Collection([App.Models.Models.User Nullable = False])&#39;。&#34;, ExceptionType:&#34; Microsoft.Data.OData.ODataException&#34;,StackTrace:&#34;在 System.Web.Http.OData.Routing.DefaultODataPathHandler.ParseAtEntityCollection(IEdmModel model,ODataPathSegment previous,IEdmType previousEdmType,String 段) System.Web.Http.OData.Routing.DefaultODataPathHandler.ParseAtCollection(IEdmModel model,ODataPathSegment previous,IEdmType previousEdmType,String 段) System.Web.Http.OData.Routing.DefaultODataPathHandler.ParseNextSegment(IEdmModel model,ODataPathSegment previous,IEdmType previousEdmType,String 段) System.Web.Http.OData.Routing.DefaultODataPathHandler.Parse(IEdmModel model,String odataPath)at System.Web.Http.OData.Routing.ODataPathRouteConstraint.Match(HttpRequestMessage request,IHttpRoute route,String parameterName,IDictionary`2 values, HttpRouteDirection routeDirection)&#34;
答案 0 :(得分:3)
我在my sample project进行了测试,它应该可行。查看我的newest commit。
在WebApiConfig.cs
中,我使用与您类似的代码添加了两个操作:
builder.EntitySet<Customer>("Customers")
.EntityType.Collection.Action("IsEmailAvailable")
.Returns<bool>()
.Parameter<string>("email");
builder.EntitySet<Customer>("Customers")
.EntityType.Action("IsEmailAvailable").Returns<bool>()
.Parameter<string>("email");
哪里,
在CustomersController
中,有两种方法:
[HttpPost]
public bool IsEmailAvailable(ODataActionParameters parameters)
{
...
}
[HttpPost]
public IHttpActionResult IsEmailAvailable(int key, ODataActionParameters parameters)
{
...
}
哪里,
有关详细实施,请参阅我的项目。
请求:
POST http://localhost:33082/odata/Customers/Extra.IsEmailAvailable
Content-Type: application/json
Content:
{"email":"saxu@microsoft.com"}
响应:
{
"@odata.context":"http://localhost:33082/odata/$metadata#Edm.Boolean","value":true
}
请求:
POST http://localhost:33082/odata/Customers/Extra.IsEmailAvailable
Content-Type: application/json
Content:
{"email":"abc@microsoft.com"}
响应:
{
"@odata.context":"http://localhost:33082/odata/$metadata#Edm.Boolean","value":false
}
NotFound
(在我的实施中,我知道密钥必须是&#34; 3&#34;否则,它返回&#34; NotFound(404)&#34; 请求:
POST http://localhost:33082/odata/Customers(2)/Extra.IsEmailAvailable
Content-Type: application/json
Content:
{"email":"saxu@microsoft.com"}
响应:
HTTP/1.1 404 Not Found
请求:
POST http://localhost:33082/odata/Customers(3)/Extra.IsEmailAvailable
Content-Type: application/json
Content:
{"email":"saxu@microsoft.com"}
响应:
{
"@odata.context":"http://localhost:33082/odata/$metadata#Edm.String","value":"Your input email is :saxu@microsoft.com"
}
此外,您可以参考以下几种材料:
答案 1 :(得分:1)
埃格
以下错误消息很有意义。它告诉&#34; IsEmailAvaliable&#34;可以与Collection一起调用。
IsEmailAvaliable' is not an action that can bind to 'Collection([App.Models.Models.User Nullable=False])'
从您的模型构建代码:
modelBuilder.EntitySet<User>("Users").EntityType.Action("IsEmailAvailable")
.Returns<bool>()
.Parameter<string>("email");
您定义IsEmailAvailable
绑定到User
类型,而不是User
类型的集合。
有两种方法可以使它发挥作用:
保持模型构建代码不变,但您应将其命名为:
http://localhost:11111/odata/Users(key)/Namespace.IsEmailAvailable
将模型构建代码修改为:
modelBuilder.EntitySet(&#34;用户&#34)。EntityType.Collection.Action(&#34; IsEmailAvailable&#34) .Returns() 。参数(&#34;电子邮件&#34);
注意:我在致电Collection
之前添加Action
。然后你可以把它称为:
http://localhost:11111/odata/Users/Namespace.IsEmailAvailable
注意:如果您使用的是与OData V4相关的库,则必须使用Namespace
。
答案 2 :(得分:1)