【问题标题】:Creating a Custom Action in an EntitySetController在 EntitySetController 中创建自定义操作
【发布时间】:2013-09-22 15:21:36
【问题描述】:

我在 .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;
    }
}

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

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

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    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

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

    【讨论】:

    • 完美!谢谢!我搜索了几个小时并没有来到那个网页。一个问题......将新动作添加到模型构建器中并不困难。是否建议使用这些自定义操作“弄脏”oData 控制器 (EntitySetController),还是应该创建一个单独的 ApiController 类来处理所有这些操作?
    • Web API 允许您混合使用 OData 和非 OData 控制器,因此这取决于您是否需要纯 OData 端点。你可以创建一个单独的 ApiController,但你会失去 OData 的好处(例如,元数据、实体上的链接)
    • “OData中的Actions使用特定格式,需要POST”一句话解决所有问题,比你给的链接好。非常感谢。
    • @MikeWasson 这些关于 OData 操作的事实应该在您链接到的 ASP.NET 文章中真正指出。我刚刚尝试创建自定义 GET 操作,但没有成功。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多