4

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

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

    $http({
        method: 'POST',
        url: '/odata/Customers/SetAlertFlag',
        data: { 'email': 'test@test.com'}
    }).success(function (data, status, headers, config) {
        // ...
    }).error(function (data, status, headers, config) {
        // ...
    });

这是我的服务器代码:

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;
    }
}

服务器方法永远不会被调用。当我在浏览器中键入此 URL 时,http://localhost:60903/odata/Customers/SetAlertFlag我收到此错误:“检测到无效操作。'SetAlertFlag' 不是可以绑定到 'Collection([Skirts.Models.Customer Nullable=False])' 的操作。”

EntitySetController 类可以没有自定义方法吗?我还应该怎么做?

4

2 回答 2

7

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"}

在这里阅读更多:http ://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

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

于 2013-09-18T19:25:52.637 回答
0

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

于 2013-09-18T01:47:08.693 回答