Asp.net web api 在EntitySetController中创建自定义操作

Asp.net web api 在EntitySetController中创建自定义操作,asp.net-web-api,odata,Asp.net Web Api,Odata,我在.NET4.5中有一个oData应用程序。oData端点工作正常,但我想在控制器上创建一个自定义操作,以便在给定电子邮件地址时在客户记录上设置标志 以下是我的客户端代码(使用AngularJS): 这是我的服务器代码: public class CustomersController : EntitySetController<Customer, int> { private DBEntities db = new DBEntities(); // ... ot

我在.NET4.5中有一个oData应用程序。oData端点工作正常,但我想在控制器上创建一个自定义操作,以便在给定电子邮件地址时在客户记录上设置标志

以下是我的客户端代码(使用AngularJS):

这是我的服务器代码:

public class CustomersController : EntitySetController<Customer, int>
{
    private DBEntities db = new DBEntities();

    // ... other generated methods here


    // my custom method
    [HttpPut]
    public Boolean SetAlertFlag([FromBody] string email)
    {
        return true;
    }
}
公共类CustomerController:EntitySetController
{
私有DBEntities db=新的DBEntities();
//…此处生成的其他方法
//我的自定义方法
[HttpPut]
公共布尔SetAlertFlag([FromBody]字符串电子邮件)
{
返回true;
}
}
从未调用服务器方法。当我在浏览器中键入此URL时
http://localhost:60903/odata/Customers/SetAlertFlag
我收到此错误:“检测到无效操作。“SetAlertFlag”不是可以绑定到“Collection([Skirts.Models.Customer Nullable=False])”的操作。”


EntitySetController类不能有自定义方法吗?我还应该怎么做呢?

您正在AngularJS中使用POST,但在.NET方法中有[HttpPut]属性。您需要在两侧使用POST或PUT。

OData中的操作使用特定格式,并且需要POST。您需要:

将操作添加到EDM:

ActionConfiguration action = modelBuilder.Entity<Customer>().Collection.Action("SetAlertFlag");
action.Parameter<string>("email");
调用如下操作:

[HttpPost]
public int SetAlertFlag(ODataActionParameters parameters) 
{ 
    if (!ModelState.IsValid)
    {
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

    string email = (string)parameters["email"];
}
POST http://localhost/odata/Customers/SetAlertFlag
Content-Type: application/json

{"email":"foo"}
请在此处阅读更多信息:


(我刚刚输入了这些代码片段,所以可能会有一些错误,但这就是我的想法。)

完美!谢谢你!我搜索了几个小时,没有找到那个网页。一个问题。。。将该新操作添加到ModelBuilder并不是一件容易的事。建议您使用这些自定义操作“脏化”oData控制器(EntitySetController),还是我应该创建一个单独的ApiController类来处理所有这些操作?Web API允许您混合使用oData和非oData控制器,因此这取决于您是否需要纯oData端点。您可以创建一个单独的ApiController,但这样您就失去了OData的好处(例如元数据、实体上的链接)“OData中的操作使用特定的格式,并且需要发布”一句话解决所有问题,比您提供的链接更好。非常感谢。@MikeWasson关于OData操作的这些事实应该在您链接到的ASP.NET文章中指出。我刚刚尝试创建一个自定义GET操作,但失败了。
POST http://localhost/odata/Customers/SetAlertFlag
Content-Type: application/json

{"email":"foo"}